Skip to content

Commit

Permalink
Merge pull request #57 from DevSimpleQuiz/#46-퀴즈페이지변경
Browse files Browse the repository at this point in the history
[#46] 퀴즈 페이지 api 및 무한 퀴즈 챌린지 UI 변경
  • Loading branch information
yeah1832 authored Nov 17, 2024
2 parents 3586934 + affbb10 commit a65817c
Show file tree
Hide file tree
Showing 8 changed files with 559 additions and 46 deletions.
17 changes: 13 additions & 4 deletions src/api/quiz.api.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import { QuizItem, QuizResult } from "../models/quiz.model";
import { quizAnswer, QuizItem, QuizResult } from "../models/quiz.model";
import { httpClient } from "./http";

interface FetchQuizzesResponse {
quizzes: QuizItem[];
}

export const fetchQuizzes = async () => {

try{
const response = await httpClient.get<FetchQuizzesResponse>("/quiz");
const response = await httpClient.get<FetchQuizzesResponse>("/quizzes");
return response.data;
}catch (error) {
return {
Expand All @@ -17,10 +16,20 @@ export const fetchQuizzes = async () => {
}
};

export const fetchAnswer = async (quizId: number, answer: string) : Promise<quizAnswer>=> {
try{
const response = await httpClient.get<quizAnswer>(`/quizzes/${quizId}/mark?answer=${answer}`);
return response.data;
}catch (error) {
console.error("API 요청 오류:", error);
throw error;
}
};

// 퀴즈 결과 저장
export const result = async (data: QuizResult) => {
try {
await httpClient.post("/quiz/result", data);
await httpClient.post("/quizzes/result", data);
} catch (error) {
console.error("결과 저장에 실패하였습니다.", error);
}
Expand Down
Binary file added src/assets/quizImg/exit.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
30 changes: 30 additions & 0 deletions src/hooks/useAnswer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { useState } from "react";
import { fetchAnswer } from "../api/quiz.api";

export const useAnswer= () => {
const [loading, setLoading] = useState<boolean>(false);
const [error, setError] = useState<string | null>(null);
const [isCorrectAnswer, setIsCorrect] = useState<boolean | null>(null); // 정답 여부 저장
const [correctAnswer, setCorrectAnswer] = useState<string | null>(null); // 올바른 답 저장

// 퀴즈 답안을 제출하는 함수
const submitAnswer = async (quizId: number, answer: string) => {
setLoading(true);
setError(null);
try {
const response = await fetchAnswer(quizId, answer);

// 서버로부터 받은 응답에서 isCorrectAnswer와 correctAnswer를 저장
setIsCorrect(response.isCorrectAnswer);
setCorrectAnswer(response.correctAnswer);

return response;
} catch (err) {
setError('답안 제출에 실패했습니다.');
} finally {
setLoading(false);
}
};

return { loading, error, isCorrectAnswer, correctAnswer, submitAnswer };
};
45 changes: 21 additions & 24 deletions src/hooks/useSaveQuizResult.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,27 @@ import { useAuthStore } from "../store/authStore";
import { result } from "../api/quiz.api";
import { QuizResult } from "../models/quiz.model";

export const useSaveQuizResult = (
totalQuestions: number,
totalScore: number
) => {
export const useSaveQuizResult = () => {
const { isLoggedIn } = useAuthStore();

useEffect(() => {
const saveResult = async () => {
if (isLoggedIn) {
console.log(`${totalScore} 점 저장 완료`);
const quizResult: QuizResult = {
totalQuizCount: totalQuestions,
solvedQuizCount: totalScore / 10,
totalQuizScore: totalScore,
};
try {
await result(quizResult);
} catch (error) {
console.error("퀴즈 결과 저장 중 오류 발생", error);
}
} else {
console.log("로그인하지 않으면 퀴즈 결과가 저장되지 않습니다.");
const saveResult = async (totalQuestions: number, totalScore: number, quizId: number) => {
if (isLoggedIn) {
console.log(`${totalScore} 점 저장 완료`);
const quizResult: QuizResult = {
totalQuizCount: totalQuestions,
solvedQuizCount: totalScore / 10,
totalQuizScore: totalScore,
quizId: quizId,
};
try {
await result(quizResult);
} catch (error) {
console.error("퀴즈 결과 저장 중 오류 발생", error);
}
};
saveResult();
}, [isLoggedIn, totalQuestions, totalScore]);
};
} else {
console.log("로그인하지 않으면 퀴즈 결과가 저장되지 않습니다.");
}
};

return saveResult; // 함수 반환
};
14 changes: 14 additions & 0 deletions src/models/quiz.model.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,27 @@
export interface QuizItem{
quizId: number;
word: string;
definition: string;
initialConstant: string;
wordLength: number;
quizAnswerStats : IquizAnswerStats;
}

export interface IquizAnswerStats{
correctAnswersCount : number;
totalAttemptsUntilFirstCorrectAnswer: number;

}

export interface quizAnswer{
isCorrectAnswer : boolean;
correctAnswer : string;
}

export interface QuizResult {
totalQuizCount: number;
solvedQuizCount: number;
totalQuizScore: number;
quizId: number,
}

Loading

0 comments on commit a65817c

Please sign in to comment.