From 8e1ec4b30bf9f7116e6a4fd3cddb205ab8500b10 Mon Sep 17 00:00:00 2001 From: Nastya Date: Thu, 15 Feb 2024 12:13:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/api/quizRelase.ts | 2 + .../ViewPublicationPage/questions/Date.tsx | 41 ++-- .../ViewPublicationPage/questions/Emoji.tsx | 12 +- .../ViewPublicationPage/questions/File.tsx | 225 ++++++++++-------- .../ViewPublicationPage/questions/Images.tsx | 6 +- .../ViewPublicationPage/questions/Rating.tsx | 2 +- .../ViewPublicationPage/questions/Variant.tsx | 121 ++++++---- 7 files changed, 237 insertions(+), 172 deletions(-) diff --git a/lib/api/quizRelase.ts b/lib/api/quizRelase.ts index 1290644..c294845 100644 --- a/lib/api/quizRelase.ts +++ b/lib/api/quizRelase.ts @@ -87,6 +87,7 @@ export function sendAnswer({ questionId, body, qid }: any) { }, ]; formData.append("answers", JSON.stringify(answers)); + console.log("QID", qid) formData.append("qid", qid); return publicationMakeRequest({ @@ -109,6 +110,7 @@ export function sendFile({ questionId, body, qid }: any) { formData.append("answers", JSON.stringify(answers)); formData.append(body.name, body.file); + console.log("QID", qid) formData.append("qid", qid); return publicationMakeRequest({ diff --git a/lib/components/ViewPublicationPage/questions/Date.tsx b/lib/components/ViewPublicationPage/questions/Date.tsx index 857c59f..dfcd4fe 100644 --- a/lib/components/ViewPublicationPage/questions/Date.tsx +++ b/lib/components/ViewPublicationPage/questions/Date.tsx @@ -11,6 +11,7 @@ import { sendAnswer } from "@api/quizRelase"; import { quizThemes } from "@utils/themes/Publication/themePublication"; import { useQuizData } from "@contexts/QuizDataContext"; +import { useState } from "react"; type DateProps = { currentQuestion: QuizQuestionDate; @@ -24,10 +25,11 @@ export const Date = ({ currentQuestion }: DateProps) => { ({ questionId }) => questionId === currentQuestion.id )?.answer as string; const currentAnswer = moment(answer) || moment(); + const [readySend, setReadySend] = useState(true) return ( - + {currentQuestion.title} { }} value={currentAnswer} onChange={async (date) => { - console.log(date); - if (!date) { - return; - } + if (readySend) { + setReadySend(false) + if (!date) { + return; + } - try { - await sendAnswer({ - questionId: currentQuestion.id, - body: moment(date).format("YYYY.MM.DD"), - qid: quizId, - }); + try { + await sendAnswer({ + questionId: currentQuestion.id, + body: moment(date).format("YYYY.MM.DD"), + qid: quizId, + }); - updateAnswer( - currentQuestion.id, - date, - 0 - ); - } catch (e) { - enqueueSnackbar("ответ не был засчитан"); + updateAnswer( + currentQuestion.id, + date, + 0 + ); + } catch (e) { + enqueueSnackbar("ответ не был засчитан"); + } + setReadySend(true) } }} slotProps={{ diff --git a/lib/components/ViewPublicationPage/questions/Emoji.tsx b/lib/components/ViewPublicationPage/questions/Emoji.tsx index 6a69ff8..ee0c7df 100644 --- a/lib/components/ViewPublicationPage/questions/Emoji.tsx +++ b/lib/components/ViewPublicationPage/questions/Emoji.tsx @@ -18,6 +18,7 @@ import { sendAnswer } from "@api/quizRelase"; import { enqueueSnackbar } from "notistack"; import type { QuizQuestionEmoji } from "../../../model/questionTypes/emoji"; import { useQuizData } from "@contexts/QuizDataContext"; +import { useState } from "react"; type EmojiProps = { currentQuestion: QuizQuestionEmoji; @@ -25,16 +26,17 @@ type EmojiProps = { export const Emoji = ({ currentQuestion }: EmojiProps) => { const theme = useTheme(); - const quizId = useQuizData(); + const { quizId } = useQuizData(); const { answers } = useQuizViewStore(); const { answer } = answers.find( ({ questionId }) => questionId === currentQuestion.id ) ?? {}; + const [readySend, setReadySend] = useState(true) return ( - {currentQuestion.title} + {currentQuestion.title} { value={index} onClick={async (event) => { event.preventDefault(); - + if (readySend) { + setReadySend(false) try { await sendAnswer({ @@ -149,6 +152,9 @@ export const Emoji = ({ currentQuestion }: EmojiProps) => { enqueueSnackbar("ответ не был засчитан"); } } + setReadySend(true) + } + }} control={ diff --git a/lib/components/ViewPublicationPage/questions/File.tsx b/lib/components/ViewPublicationPage/questions/File.tsx index da859a0..3149d03 100644 --- a/lib/components/ViewPublicationPage/questions/File.tsx +++ b/lib/components/ViewPublicationPage/questions/File.tsx @@ -3,6 +3,7 @@ import { ButtonBase, IconButton, Modal, + Skeleton, Typography, useTheme } from "@mui/material"; @@ -118,73 +119,78 @@ const UPLOAD_FILE_DESCRIPTIONS_MAP: Record< export const File = ({ currentQuestion }: FileProps) => { const theme = useTheme(); const { answers } = useQuizViewStore(); - const quizId = useQuizData(); + const { quizId } = useQuizData(); const [statusModal, setStatusModal] = useState<"errorType" | "errorSize" | "picture" | "video" | "audio" | "document" | "">(""); + const [readySend, setReadySend] = useState(true) const answer = answers.find( ({ questionId }) => questionId === currentQuestion.id )?.answer as string; const isMobile = useRootContainerSize() < 500; const uploadFile = async ({ target }: ChangeEvent) => { - const file = target.files?.[0]; - if (file) { - if (file.size <= 52428800) { - //проверяем на соответствие - console.log(file.name.toLowerCase()); - if (ACCEPT_SEND_FILE_TYPES_MAP[currentQuestion.content.type].find((ednding => { - console.log(ednding); - console.log(file.name.toLowerCase().endsWith(ednding)); - return file.name.toLowerCase().endsWith(ednding); - }))) { + if (readySend) { + setReadySend(false) + const file = target.files?.[0]; + if (file) { + if (file.size <= 52428800) { + //проверяем на соответствие + console.log(file.name.toLowerCase()); + if (ACCEPT_SEND_FILE_TYPES_MAP[currentQuestion.content.type].find((ednding => { + console.log(ednding); + console.log(file.name.toLowerCase().endsWith(ednding)); + return file.name.toLowerCase().endsWith(ednding); + }))) { - //Нужный формат - console.log(file); - try { + //Нужный формат + console.log(file); + try { - const data = await sendFile({ - questionId: currentQuestion.id, - body: { - file: file, - name: file.name - }, - qid: quizId, - }); - console.log(data); + const data = await sendFile({ + questionId: currentQuestion.id, + body: { + file: file, + name: file.name + }, + qid: quizId, + }); + console.log(data); - await sendAnswer({ - questionId: currentQuestion.id, - body: `https://storage.yandexcloud.net/squizanswer/${quizId}/${currentQuestion.id}/${data.data.fileIDMap[currentQuestion.id]}`, - qid: quizId, - }); + await sendAnswer({ + questionId: currentQuestion.id, + body: `https://storage.yandexcloud.net/squizanswer/${quizId}/${currentQuestion.id}/${data.data.fileIDMap[currentQuestion.id]}`, + qid: quizId, + }); - updateAnswer( - currentQuestion.id, - `${file.name}|${URL.createObjectURL(file)}`, - 0 - ); + updateAnswer( + currentQuestion.id, + `${file.name}|${URL.createObjectURL(file)}`, + 0 + ); - } catch (e) { - console.log(e); - enqueueSnackbar("ответ не был засчитан"); + } catch (e) { + console.log(e); + enqueueSnackbar("ответ не был засчитан"); + } + + } else { + + //неподходящий формат + setStatusModal("errorType"); } - } else { - //неподходящий формат - setStatusModal("errorType"); + setStatusModal("errorSize"); } - } else { - setStatusModal("errorSize"); } - + setReadySend(true) } }; return ( <> - {currentQuestion.title} + {currentQuestion.title} { {answer?.split("|")[0]} { + onClick={async () => { + if (answer.length > 0) { + setReadySend(false) + await sendAnswer({ + questionId: currentQuestion.id, + body: "", + qid: quizId, + }) + } + console.log(answer) updateAnswer(currentQuestion.id, "", 0); + setReadySend(true) }} > @@ -234,62 +250,77 @@ export const File = ({ currentQuestion }: FileProps) => { display: "flex", alignItems: "center" }}> - - - ) => - event.preventDefault() - } - sx={{ - width: "100%", - height: isMobile ? undefined : "120px", - display: "flex", - gap: "50px", - justifyContent: "flex-start", - alignItems: "center", - padding: "33px 44px 33px 55px", - backgroundColor: theme.palette.background.default, - border: `1px solid #9A9AAF`, - // border: `1px solid ${theme.palette.grey2.main}`, - borderRadius: "8px", - }} - > - - - + + + ) => + event.preventDefault() + } sx={{ - color: "#9A9AAF", - // color: theme.palette.grey2.main, - fontWeight: 500, + width: "100%", + height: isMobile ? undefined : "120px", + display: "flex", + gap: "50px", + justifyContent: "flex-start", + alignItems: "center", + padding: "33px 44px 33px 55px", + backgroundColor: theme.palette.background.default, + border: `1px solid #9A9AAF`, + // border: `1px solid ${theme.palette.grey2.main}`, + borderRadius: "8px", }} > - { - UPLOAD_FILE_DESCRIPTIONS_MAP[currentQuestion.content.type] - .title - } - - - { - UPLOAD_FILE_DESCRIPTIONS_MAP[currentQuestion.content.type] - .description - } - - - - + + + + { + UPLOAD_FILE_DESCRIPTIONS_MAP[currentQuestion.content.type] + .title + } + + + { + UPLOAD_FILE_DESCRIPTIONS_MAP[currentQuestion.content.type] + .description + } + + + + + + + : + + } setStatusModal(currentQuestion.content.type)} /> )} diff --git a/lib/components/ViewPublicationPage/questions/Images.tsx b/lib/components/ViewPublicationPage/questions/Images.tsx index 6eac749..c77d713 100644 --- a/lib/components/ViewPublicationPage/questions/Images.tsx +++ b/lib/components/ViewPublicationPage/questions/Images.tsx @@ -22,7 +22,7 @@ type ImagesProps = { }; export const Images = ({ currentQuestion }: ImagesProps) => { - const quizId =useQuizData(); + const { quizId } =useQuizData(); const { answers } = useQuizViewStore(); const theme = useTheme(); const answer = answers.find(({ questionId }) => questionId === currentQuestion.id)?.answer; @@ -69,6 +69,8 @@ export const Images = ({ currentQuestion }: ImagesProps) => { onClick={async (event) => { event.preventDefault(); + console.log("пытаюсь передать qid") + console.log(quizId) try { await sendAnswer({ @@ -92,6 +94,8 @@ export const Images = ({ currentQuestion }: ImagesProps) => { deleteAnswer(currentQuestion.id); try { + console.log("пытаюсь передать qid") + console.log(quizId) await sendAnswer({ questionId: currentQuestion.id, body: "", diff --git a/lib/components/ViewPublicationPage/questions/Rating.tsx b/lib/components/ViewPublicationPage/questions/Rating.tsx index 750300a..652085c 100644 --- a/lib/components/ViewPublicationPage/questions/Rating.tsx +++ b/lib/components/ViewPublicationPage/questions/Rating.tsx @@ -57,7 +57,7 @@ const buttonRatingForm = [ ]; export const Rating = ({ currentQuestion }: RatingProps) => { - const quizId = useQuizData(); + const { quizId } = useQuizData(); const { answers } = useQuizViewStore(); const theme = useTheme(); const isMobile = useRootContainerSize() < 650; diff --git a/lib/components/ViewPublicationPage/questions/Variant.tsx b/lib/components/ViewPublicationPage/questions/Variant.tsx index cee7f36..c58aa94 100644 --- a/lib/components/ViewPublicationPage/questions/Variant.tsx +++ b/lib/components/ViewPublicationPage/questions/Variant.tsx @@ -10,7 +10,7 @@ import { Typography, useTheme } from "@mui/material"; -import { FC, useEffect } from "react"; +import { FC, useEffect, useState } from "react"; import { deleteAnswer, @@ -44,6 +44,8 @@ type VariantItemProps = { answer: string | string[] | undefined; index: number; own?: boolean; + readySend: boolean; + setReadySend: (a: boolean) => void }; export const Variant = ({ currentQuestion }: VariantProps) => { @@ -58,6 +60,8 @@ export const Variant = ({ currentQuestion }: VariantProps) => { (variant) => variant.id === currentQuestion.id ); + const [readySend, setReadySend] = useState(true) + const Group = currentQuestion.content.multi ? FormGroup : RadioGroup; useEffect(() => { @@ -68,9 +72,11 @@ export const Variant = ({ currentQuestion }: VariantProps) => { return ( - {currentQuestion.title} - + {currentQuestion.title} + { // @ts-ignore answer={answer} index={index} + readySend={readySend} + setReadySend={setReadySend} /> ))} {currentQuestion.content.own && ownVariant && ( @@ -112,6 +120,8 @@ export const Variant = ({ currentQuestion }: VariantProps) => { // @ts-ignore answer={answer} index={currentQuestion.content.variants.length + 2} + readySend={readySend} + setReadySend={setReadySend} /> )} @@ -137,6 +147,8 @@ const VariantItem = ({ answer, index, own = false, + readySend, + setReadySend }: VariantItemProps) => { const theme = useTheme(); const { settings, quizId } = useQuizData(); @@ -185,69 +197,74 @@ const VariantItem = ({ label={own ? : variant.answer} onClick={async (event) => { event.preventDefault(); - const variantId = currentQuestion.content.variants[index].id; - console.log(answer); + if (readySend) { + setReadySend(false) + const variantId = currentQuestion.content.variants[index].id; + console.log(answer); - if (currentQuestion.content.multi) { - const currentAnswer = typeof answer !== "string" ? answer || [] : []; + if (currentQuestion.content.multi) { + const currentAnswer = typeof answer !== "string" ? answer || [] : []; + + try { + await sendAnswer({ + questionId: currentQuestion.id, + body: currentAnswer.includes(variantId) + ? currentAnswer?.filter((item) => item !== variantId) + : [...currentAnswer, variantId], + qid: quizId, + }); + + updateAnswer( + currentQuestion.id, + currentAnswer.includes(variantId) + ? currentAnswer?.filter((item) => item !== variantId) + : [...currentAnswer, variantId], + currentQuestion.content.variants[index].points || 0 + ); + } catch (e) { + console.log(e); + enqueueSnackbar("ответ не был засчитан"); + } + + return; + } try { await sendAnswer({ questionId: currentQuestion.id, - body: currentAnswer.includes(variantId) - ? currentAnswer?.filter((item) => item !== variantId) - : [...currentAnswer, variantId], + body: currentQuestion.content.variants[index].answer, qid: quizId, }); - updateAnswer( - currentQuestion.id, - currentAnswer.includes(variantId) - ? currentAnswer?.filter((item) => item !== variantId) - : [...currentAnswer, variantId], - currentQuestion.content.variants[index].points || 0 + updateAnswer(currentQuestion.id, variantId, + answer === variantId ? 0 + : + currentQuestion.content.variants[index].points || 0 ); - } catch (e) { - console.log(e); - enqueueSnackbar("ответ не был засчитан"); - } - - return; - } - - try { - await sendAnswer({ - questionId: currentQuestion.id, - body: currentQuestion.content.variants[index].answer, - qid: quizId, - }); - - updateAnswer(currentQuestion.id, variantId, - answer === variantId ? 0 - : - currentQuestion.content.variants[index].points || 0 - ); - - } catch (e) { - console.log(e); - enqueueSnackbar("ответ не был засчитан"); - } - - if (answer === variantId) { - try { - - await sendAnswer({ - questionId: currentQuestion.id, - body: "", - qid: quizId, - }); } catch (e) { console.log(e); enqueueSnackbar("ответ не был засчитан"); } - deleteAnswer(currentQuestion.id); + + if (answer === variantId) { + try { + + await sendAnswer({ + questionId: currentQuestion.id, + body: "", + qid: quizId, + }); + + } catch (e) { + console.log(e); + enqueueSnackbar("ответ не был засчитан"); + } + deleteAnswer(currentQuestion.id); + } + setReadySend(true) } + }} /> );