import { Box, ButtonBase, IconButton, Modal, Skeleton, Typography, useTheme } from "@mui/material"; import { updateAnswer, useQuizViewStore } from "@stores/quizView"; import CloseBold from "@icons/CloseBold"; import UploadIcon from "@icons/UploadIcon"; import { sendAnswer, sendFile } from "@api/quizRelase"; import Info from "@icons/Info"; import type { UploadFileType } from "@model/questionTypes/file"; import { enqueueSnackbar } from "notistack"; import type { DragEvent } from "react"; import { useState, type ChangeEvent } from "react"; import { useRootContainerSize } from "../../../contexts/RootContainerWidthContext"; import type { QuizQuestionFile } from "../../../model/questionTypes/file"; import { useQuizData } from "@contexts/QuizDataContext"; type FileProps = { currentQuestion: QuizQuestionFile; }; const CurrentModal = ({ status }: { status: "errorType" | "errorSize" | "picture" | "video" | "audio" | "document" | ""; }) => { switch (status) { case 'errorType': return (<> Выбран некорректный тип файла ); case 'errorSize': return (<> Файл слишком большой. Максимальный размер 50 МБ ); default: return (<> Допустимые расширения файлов: { //@ts-ignore ACCEPT_SEND_FILE_TYPES_MAP[status].join(" ")} ); } }; const ACCEPT_SEND_FILE_TYPES_MAP = { picture: [ ".jpeg", ".jpg", ".png", ".ico", ".gif", ".tiff", ".webp", ".eps", ".svg" ], video: [ ".mp4", ".mov", ".wmv", ".avi", ".avchd", ".flv", ".f4v", ".swf", ".mkv", ".webm", ".mpeg-2" ], audio: [ ".aac", ".aiff", ".dsd", ".flac", ".mp3", ".mqa", ".ogg", ".wav", ".wma" ], document: [ ".doc", ".docx", ".dotx", ".rtf", ".odt", ".pdf", ".txt", ".xls", ".ppt", ".xlsx", ".pptx", ".pages", ], }; const UPLOAD_FILE_DESCRIPTIONS_MAP: Record< UploadFileType, { title: string; description: string; } > = { picture: { title: "Добавить изображение", description: "Принимает изображения", }, video: { title: "Добавить видео", description: "Принимает .mp4 и .mov формат — максимум 50мб", }, audio: { title: "Добавить аудиофайл", description: "Принимает аудиофайлы" }, document: { title: "Добавить документ", description: "Принимает документы" }, } as const; export const File = ({ currentQuestion }: FileProps) => { const theme = useTheme(); const { answers } = useQuizViewStore(); 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) => { 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 { 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, }); updateAnswer( currentQuestion.id, `${file.name}|${URL.createObjectURL(file)}`, 0 ); } catch (e) { console.log(e); enqueueSnackbar("ответ не был засчитан"); } } else { //неподходящий формат setStatusModal("errorType"); } } else { setStatusModal("errorSize"); } } setReadySend(true) } }; return ( <> {currentQuestion.title} {answer?.split("|")[0] && ( Вы загрузили: {answer?.split("|")[0]} { if (answer.length > 0) { setReadySend(false) await sendAnswer({ questionId: currentQuestion.id, body: "", qid: quizId, }) } console.log(answer) updateAnswer(currentQuestion.id, "", 0); setReadySend(true) }} > )} {!answer?.split("|")[0] && ( { readySend ? <> ) => 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", }} > { UPLOAD_FILE_DESCRIPTIONS_MAP[currentQuestion.content.type] .title } { UPLOAD_FILE_DESCRIPTIONS_MAP[currentQuestion.content.type] .description } : } setStatusModal(currentQuestion.content.type)} /> )} {answer && currentQuestion.content.type === "picture" && ( )} {answer && currentQuestion.content.type === "video" && ( setStatusModal("")} > ); };