import { Box, Typography, ButtonBase, useTheme, IconButton, useMediaQuery, Modal, } from "@mui/material"; import { useQuizViewStore, updateAnswer } from "@stores/quizView/store"; import { UPLOAD_FILE_TYPES_MAP } from "../tools/File"; import UploadIcon from "@icons/UploadIcon"; import CloseBold from "@icons/CloseBold"; import { useState, type ChangeEvent } from "react"; import type { QuizQuestionFile } from "../../../model/questionTypes/file"; import type { DragEvent } from "react"; import type { UploadFileType } from "@model/questionTypes/file"; import { enqueueSnackbar } from "notistack"; import { sendAnswer, sendFile } from "@api/quizRelase"; import { useQuestionsStore } from "@stores/quizData/store" import Info from "@icons/Info"; 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 формат — максимум 100мб", }, audio: { title: "Добавить аудиофайл", description: "Принимает аудиофайлы" }, document: { title: "Добавить документ", description: "Принимает документы" }, } as const; export const File = ({ currentQuestion }: FileProps) => { const theme = useTheme(); const { settings } = useQuestionsStore() const { answers } = useQuizViewStore(); const [statusModal, setStatusModal] = useState<"errorType" | "errorSize" | "picture" | "video" | "audio" | "document" | "">("") const answer = answers.find( ({ questionId }) => questionId === currentQuestion.id )?.answer as string; const isMobile = useMediaQuery(theme.breakpoints.down(500)); const uploadFile = async ({ target }: ChangeEvent) => { if (!settings) return; 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: settings.qid }) console.log(data) await sendAnswer({ questionId: currentQuestion.id, //@ts-ignore body: `https://storage.yandexcloud.net/squizanswer/${settings.qid}/${currentQuestion.id}/${data.data.fileIDMap[currentQuestion.id]}`, //@ts-ignore qid: settings.qid }) updateAnswer( currentQuestion.id, `${file.name}|${URL.createObjectURL(file)}` ); } catch (e) { console.log(e) enqueueSnackbar("ответ не был засчитан") } } else { //неподходящий формат setStatusModal("errorType") } } else { setStatusModal("errorSize") } } }; return ( <> {currentQuestion.title} {answer?.split("|")[0] && ( Вы загрузили: {answer?.split("|")[0]} { updateAnswer(currentQuestion.id, ""); }} > )} {!answer?.split("|")[0] && ( ) => 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("")} > ); };