quiz
This commit is contained in:
@ -12,10 +12,12 @@ export const CardAvailableTest = ({ title, description, path, status }) => {
|
||||
to={`/${path}`}
|
||||
aria-disabled={true}
|
||||
className="card-available-test__container"
|
||||
style={{
|
||||
// opacity: status !== 1 ? 0.3 : 1,
|
||||
// pointerEvents: status !== 1 ? "none" : "all",
|
||||
}}
|
||||
style={
|
||||
{
|
||||
// opacity: status !== 1 ? 0.3 : 1,
|
||||
// pointerEvents: status !== 1 ? "none" : "all",
|
||||
}
|
||||
}
|
||||
>
|
||||
<div className="card-available-test__top-head">
|
||||
<StarRating />
|
||||
|
@ -1,7 +1,7 @@
|
||||
import React from "react";
|
||||
|
||||
export const GetOptionTask = ({ type, answer, handleChange }) => {
|
||||
const {answer_body,id} = answer
|
||||
const { answer_body, id } = answer;
|
||||
return (
|
||||
<div className="form-task__group" key={id}>
|
||||
<input
|
||||
|
@ -13,7 +13,6 @@ export const HeaderQuiz = ({ header }) => {
|
||||
const userId = localStorage.getItem("id");
|
||||
const userInfo = useSelector(selectUserInfo);
|
||||
|
||||
|
||||
return (
|
||||
<div>
|
||||
{userInfo?.status === 500 ? (
|
||||
|
@ -1,68 +1,72 @@
|
||||
import moment from "moment";
|
||||
import React, { useEffect } from "react";
|
||||
import { useDispatch, useSelector } from "react-redux";
|
||||
import { setQuestions } from "@redux/quizSlice";
|
||||
import StarRating from "@components/StarRating/StarRating";
|
||||
import accempt from "assets/images/quiz/accempt.png";
|
||||
import iconTomer from "assets/images/quiz/timer.png";
|
||||
import { apiRequest } from "@api/request";
|
||||
import moment from "moment";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
|
||||
import { setQuestions } from "@redux/quizSlice";
|
||||
|
||||
import { apiRequest } from "@api/request";
|
||||
|
||||
import { useNotification } from "@hooks/useNotification";
|
||||
|
||||
export const QuizPassingInformation = ({ setStartTest, uuid, timer }) => {
|
||||
import StarRating from "@components/StarRating/StarRating";
|
||||
|
||||
import accempt from "assets/images/quiz/accempt.png";
|
||||
import iconTomer from "assets/images/quiz/timer.png";
|
||||
|
||||
export const QuizPassingInformation = ({ setStartTest, uuid, timer }) => {
|
||||
const { restart, pause, hours, minutes, seconds, isRunning } = timer;
|
||||
const navigate = useNavigate();
|
||||
const { showNotification } = useNotification();
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const startTesting = () => {
|
||||
apiRequest(
|
||||
`/question/get-questions?uuid=${uuid}`
|
||||
)
|
||||
apiRequest(`/question/get-questions?uuid=${uuid}`)
|
||||
.then((res) => {
|
||||
if (res.status === 400) {
|
||||
dispatch(setQuestions(null));
|
||||
showNotification({
|
||||
show: true,
|
||||
text: res?.message || "",
|
||||
type: "error"
|
||||
type: "error",
|
||||
});
|
||||
return;
|
||||
}
|
||||
dispatch(setQuestions(res));
|
||||
setStartTest(true);
|
||||
restart(moment()
|
||||
.add(res[0]?.time_limit.split(":")[0], "hours")
|
||||
.add(res[0]?.time_limit.split(":")[1], "minutes")
|
||||
.add(res[0]?.time_limit.split(":")[2], "seconds"), true);
|
||||
restart(
|
||||
moment()
|
||||
.add(res[0]?.time_limit.split(":")[0], "hours")
|
||||
.add(res[0]?.time_limit.split(":")[1], "minutes")
|
||||
.add(res[0]?.time_limit.split(":")[2], "seconds"),
|
||||
true
|
||||
);
|
||||
})
|
||||
.catch(e => {
|
||||
.catch((e) => {
|
||||
dispatch(setQuestions(null));
|
||||
});
|
||||
};
|
||||
|
||||
const checkTest = () =>
|
||||
apiRequest(
|
||||
`user-questionnaire/questionnaire-completed?user_questionnaire_uuid=${uuid}`
|
||||
);
|
||||
|
||||
const checkTest = () => apiRequest(
|
||||
`user-questionnaire/questionnaire-completed?user_questionnaire_uuid=${uuid}`
|
||||
);
|
||||
|
||||
const completeTest = () => apiRequest(
|
||||
"/user-questionnaire/questionnaire-completed", {
|
||||
method: "POST"
|
||||
const completeTest = () =>
|
||||
apiRequest("/user-questionnaire/questionnaire-completed", {
|
||||
method: "POST",
|
||||
});
|
||||
|
||||
const finishQuiz = async () => {
|
||||
Promise.all([checkTest, completeTest])
|
||||
.then(function() {
|
||||
.then(function () {
|
||||
pause();
|
||||
})
|
||||
.catch(e => {
|
||||
.catch((e) => {
|
||||
console.log(e);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
return (
|
||||
<div className="quiz-passing-information">
|
||||
<div className="quiz-passing-information__container">
|
||||
@ -79,33 +83,36 @@ export const QuizPassingInformation = ({ setStartTest, uuid, timer }) => {
|
||||
разработчик
|
||||
</div>
|
||||
</div>
|
||||
{isRunning && <div className="quiz-passing-information__timer timer-quiz">
|
||||
<div className="quiz-passing-information__icon">
|
||||
<img src={iconTomer} alt="" />
|
||||
{isRunning && (
|
||||
<div className="quiz-passing-information__timer timer-quiz">
|
||||
<div className="quiz-passing-information__icon">
|
||||
<img src={iconTomer} alt="" />
|
||||
</div>
|
||||
<div className="quiz-passing-information__text">
|
||||
Время на прохождение теста:
|
||||
<br />
|
||||
<span>
|
||||
{hours.toString().padStart(2, "0") +
|
||||
":" +
|
||||
minutes.toString().padStart(2, "0") +
|
||||
":" +
|
||||
seconds.toString().padStart(2, "0")}
|
||||
секунд
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="quiz-passing-information__text">
|
||||
Время на прохождение теста:
|
||||
<br />
|
||||
<span>
|
||||
{hours.toString().padStart(2, "0") +
|
||||
":" +
|
||||
minutes.toString().padStart(2, "0") +
|
||||
":" +
|
||||
seconds.toString().padStart(2, "0")
|
||||
}
|
||||
секунд
|
||||
</span>
|
||||
)}
|
||||
{!isRunning && (
|
||||
<div className="quiz-passing-information__attempt">
|
||||
<div className="quiz-passing-information__icon">
|
||||
<img src={accempt} alt="" />
|
||||
</div>
|
||||
<div className="quiz-passing-information__text">
|
||||
Попыток прохождения: <br />
|
||||
<span>1 попытка</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>}
|
||||
{!isRunning && <div className="quiz-passing-information__attempt">
|
||||
<div className="quiz-passing-information__icon">
|
||||
<img src={accempt} alt="" />
|
||||
</div>
|
||||
<div className="quiz-passing-information__text">
|
||||
Попыток прохождения: <br />
|
||||
<span>1 попытка</span>
|
||||
</div>
|
||||
</div>}
|
||||
)}
|
||||
<div>
|
||||
{!isRunning && (
|
||||
<button
|
||||
@ -116,10 +123,16 @@ export const QuizPassingInformation = ({ setStartTest, uuid, timer }) => {
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
{isRunning &&
|
||||
<button className="quiz-passing-information__button quiz-btn" onClick={finishQuiz}>Завершить</button>}
|
||||
{isRunning && (
|
||||
<button
|
||||
className="quiz-passing-information__button quiz-btn"
|
||||
onClick={finishQuiz}
|
||||
>
|
||||
Завершить
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
};
|
||||
|
@ -1,18 +1,23 @@
|
||||
import moment from "moment";
|
||||
import React, { useState } from "react";
|
||||
import { useSelector } from "react-redux";
|
||||
import { questionsSelector } from "@redux/quizSlice";
|
||||
import questionIcon from "assets/images/question.png";
|
||||
import { GetOptionTask } from "./GetOptionTask";
|
||||
import "./quiz.scss";
|
||||
import { useHandlerFieldTest } from "@hooks/useHandlerFieldTest";
|
||||
import { useParams } from "react-router-dom";
|
||||
import moment from "moment";
|
||||
import { Loader } from "@components/Common/Loader/Loader";
|
||||
|
||||
import { questionsSelector } from "@redux/quizSlice";
|
||||
|
||||
import { apiRequest } from "@api/request";
|
||||
|
||||
import { useHandlerFieldTest } from "@hooks/useHandlerFieldTest";
|
||||
import { useNotification } from "@hooks/useNotification";
|
||||
|
||||
export const TaskQuiz = ({ timer }) => {
|
||||
import { Loader } from "@components/Common/Loader/Loader";
|
||||
|
||||
import questionIcon from "assets/images/question.png";
|
||||
|
||||
import { GetOptionTask } from "./GetOptionTask";
|
||||
import "./quiz.scss";
|
||||
|
||||
export const TaskQuiz = ({ timer }) => {
|
||||
const { restart } = timer;
|
||||
const { uuid } = useParams();
|
||||
const questions = useSelector(questionsSelector);
|
||||
@ -23,13 +28,13 @@ export const TaskQuiz = ({ timer }) => {
|
||||
const { values, handleChange, setValues } = useHandlerFieldTest({
|
||||
uuid,
|
||||
questions,
|
||||
indexQuestion: index
|
||||
indexQuestion: index,
|
||||
});
|
||||
|
||||
const nextQuestion = async (e) => {
|
||||
e.preventDefault();
|
||||
//Проверка на существование овтетов
|
||||
if (!(values.length)) {
|
||||
if (!values.length) {
|
||||
alert("Вы не ответили на вопрос");
|
||||
return;
|
||||
}
|
||||
@ -38,16 +43,16 @@ export const TaskQuiz = ({ timer }) => {
|
||||
setLoadingSendAnswers(true);
|
||||
await apiRequest(`/user-response/set-responses`, {
|
||||
method: "POST",
|
||||
data: values
|
||||
data: values,
|
||||
})
|
||||
.then(res => {
|
||||
.then((res) => {
|
||||
if (String(res?.status)[0] !== "2") {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: res?.message || "",
|
||||
type: "error"
|
||||
type: "error",
|
||||
});
|
||||
return
|
||||
return;
|
||||
}
|
||||
|
||||
if (index === questions.length - 1) return;
|
||||
@ -59,11 +64,11 @@ export const TaskQuiz = ({ timer }) => {
|
||||
setIndex((prev) => prev + 1);
|
||||
setValues([]);
|
||||
})
|
||||
.catch(e => {
|
||||
.catch((e) => {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: e?.message || "",
|
||||
type: "error"
|
||||
type: "error",
|
||||
});
|
||||
})
|
||||
.finally(() => setLoadingSendAnswers(false));
|
||||
@ -76,63 +81,71 @@ export const TaskQuiz = ({ timer }) => {
|
||||
|
||||
const setValueTimer = () => {
|
||||
const time_limit = questions[index + 1].time_limit.split(":");
|
||||
restart(moment()
|
||||
.add(time_limit[0], "hours")
|
||||
.add(time_limit[1], "minutes")
|
||||
.add(time_limit[2], "seconds"));
|
||||
restart(
|
||||
moment()
|
||||
.add(time_limit[0], "hours")
|
||||
.add(time_limit[1], "minutes")
|
||||
.add(time_limit[2], "seconds")
|
||||
);
|
||||
};
|
||||
|
||||
console.log(questions);
|
||||
return (
|
||||
<div className="task">
|
||||
{
|
||||
questions ?
|
||||
<div className="task__container">
|
||||
<div className="task__header">
|
||||
<img src={questionIcon} alt="questionIcon" />
|
||||
<h3 className="task__title quiz-title_h3">
|
||||
{questions[index].question_body}
|
||||
</h3>
|
||||
</div>
|
||||
<div className="task__body">
|
||||
<form className="task__form form-task"
|
||||
onSubmit={index !== questions.length - 1 ? nextQuestion : complete}>
|
||||
{
|
||||
questions[index].question_type_id === 1 ?
|
||||
<div className="form-task__group">
|
||||
<textarea
|
||||
className="form-task__field"
|
||||
value={values[0]?.response_body}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
</div>
|
||||
: questions[index]?.answers?.map((answer) => (
|
||||
<GetOptionTask
|
||||
key={answer.id}
|
||||
type={questions[index].question_type_id}
|
||||
handleChange={handleChange}
|
||||
answer={answer}
|
||||
/>
|
||||
))
|
||||
}
|
||||
<div className="form-task__buttons">
|
||||
<button
|
||||
onClick={nextQuestion}
|
||||
disabled={isLoadingSendAnswers}
|
||||
className="form-task__btn quiz-btn"
|
||||
>
|
||||
{isLoadingSendAnswers ? <Loader width={25} height={25} />
|
||||
: (index !== questions.length - 1 ? "Далее" : "Завершить")
|
||||
}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{questions ? (
|
||||
<div className="task__container">
|
||||
<div className="task__header">
|
||||
<img src={questionIcon} alt="questionIcon" />
|
||||
<h3 className="task__title quiz-title_h3">
|
||||
{questions[index].question_body}
|
||||
</h3>
|
||||
</div>
|
||||
:
|
||||
<h1>ОШибка</h1>
|
||||
}
|
||||
|
||||
<div className="task__body">
|
||||
<form
|
||||
className="task__form form-task"
|
||||
onSubmit={
|
||||
index !== questions.length - 1 ? nextQuestion : complete
|
||||
}
|
||||
>
|
||||
{questions[index].question_type_id === 1 ? (
|
||||
<div className="form-task__group">
|
||||
<textarea
|
||||
className="form-task__field"
|
||||
value={values[0]?.response_body}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
questions[index]?.answers?.map((answer) => (
|
||||
<GetOptionTask
|
||||
key={answer.id}
|
||||
type={questions[index].question_type_id}
|
||||
handleChange={handleChange}
|
||||
answer={answer}
|
||||
/>
|
||||
))
|
||||
)}
|
||||
<div className="form-task__buttons">
|
||||
<button
|
||||
onClick={nextQuestion}
|
||||
disabled={isLoadingSendAnswers}
|
||||
className="form-task__btn quiz-btn"
|
||||
>
|
||||
{isLoadingSendAnswers ? (
|
||||
<Loader width={25} height={25} />
|
||||
) : index !== questions.length - 1 ? (
|
||||
"Далее"
|
||||
) : (
|
||||
"Завершить"
|
||||
)}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<h1>ОШибка</h1>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
Reference in New Issue
Block a user