This commit is contained in:
2023-11-21 17:46:57 +03:00
parent ec7d0716b3
commit b0c9884fe4
9 changed files with 217 additions and 195 deletions

View File

@ -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 />

View File

@ -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

View File

@ -13,7 +13,6 @@ export const HeaderQuiz = ({ header }) => {
const userId = localStorage.getItem("id");
const userInfo = useSelector(selectUserInfo);
return (
<div>
{userInfo?.status === 500 ? (

View File

@ -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>
);
};
};

View File

@ -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>
);
};