frontAnswerer/src/pages/ViewPublicationPage/questions/File.tsx

202 lines
6.1 KiB
TypeScript
Raw Normal View History

2023-12-16 14:55:56 +00:00
import {
Box,
Typography,
ButtonBase,
useTheme,
IconButton,
} from "@mui/material";
import { useQuizViewStore, updateAnswer } from "@root/quizView/store";
import { UPLOAD_FILE_TYPES_MAP } from "../tools/File";
2023-12-16 14:55:56 +00:00
import UploadIcon from "@icons/UploadIcon";
import CloseBold from "@icons/CloseBold";
import 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 { sendFile } from "@api/quizRelase";
import { useQuestionsStore } from "@root/quizData/store"
2023-12-16 14:55:56 +00:00
type FileProps = {
currentQuestion: QuizQuestionFile;
};
export const UPLOAD_FILE_DESCRIPTIONS_MAP: Record<
UploadFileType,
{ title: string; description: string }
> = {
all: { title: "Добавить файл", description: "Принимает любые файлы" },
picture: {
title: "Добавить изображение",
description: "Принимает изображения",
},
video: {
title: "Добавить видео",
description: "Принимает .mp4 и .mov формат — максимум 100мб",
},
audio: { title: "Добавить аудиофайл", description: "Принимает аудиофайлы" },
document: { title: "Добавить документ", description: "Принимает документы" },
} as const;
export const File = ({ currentQuestion }: FileProps) => {
const { settings } = useQuestionsStore()
2023-12-16 14:55:56 +00:00
const { answers } = useQuizViewStore();
const answer = answers.find(
({ questionId }) => questionId === currentQuestion.id
2023-12-16 14:55:56 +00:00
)?.answer as string;
const theme = useTheme();
const uploadFile = async ({ target }: ChangeEvent<HTMLInputElement>) => {
2023-12-16 14:55:56 +00:00
const file = target.files?.[0];
if (file) {
try {
await sendFile({
questionId: currentQuestion.id,
body: {
file: `${file.name}|${URL.createObjectURL(file)}`,
name: file.name
},
//@ts-ignore
qid: settings.qid
})
updateAnswer(
currentQuestion.id,
`${file.name}|${URL.createObjectURL(file)}`
);
} catch (e) {
enqueueSnackbar("ответ не был засчитан")
}
2023-12-16 14:55:56 +00:00
}
};
return (
<Box>
2023-12-29 00:58:19 +00:00
<Typography variant="h5" color={theme.palette.text.primary}>{currentQuestion.title}</Typography>
2023-12-16 14:55:56 +00:00
<Box
sx={{
display: "flex",
flexDirection: "column",
width: "100%",
marginTop: "20px",
maxWidth: answer?.split("|")[0] ? "640px" : "550px",
}}
>
{answer?.split("|")[0] && (
<Box sx={{ display: "flex", alignItems: "center", gap: "15px" }}>
2023-12-29 00:58:19 +00:00
<Typography color={theme.palette.text.primary}>Вы загрузили:</Typography>
2023-12-16 14:55:56 +00:00
<Box
sx={{
padding: "5px 5px 5px 16px",
2023-12-29 00:58:19 +00:00
backgroundColor: theme.palette.primary.main,
2023-12-16 14:55:56 +00:00
borderRadius: "8px",
color: "#FFFFFF",
display: "flex",
alignItems: "center",
gap: "15px",
}}
>
<Typography>{answer?.split("|")[0]}</Typography>
<IconButton
sx={{ p: 0 }}
onClick={() => {
2023-12-29 00:58:19 +00:00
updateAnswer(currentQuestion.id, "");
2023-12-16 14:55:56 +00:00
}}
>
<CloseBold />
</IconButton>
</Box>
</Box>
)}
{!answer?.split("|")[0] && (
<ButtonBase component="label" sx={{ justifyContent: "flex-start" }}>
<input
onChange={uploadFile}
hidden
accept={UPLOAD_FILE_TYPES_MAP[currentQuestion.content.type]}
multiple
type="file"
/>
<Box
onDragOver={(event: DragEvent<HTMLDivElement>) =>
event.preventDefault()
}
sx={{
width: "100%",
height: "120px",
display: "flex",
gap: "50px",
justifyContent: "flex-start",
alignItems: "center",
padding: "33px 44px 33px 55px",
backgroundColor: theme.palette.background.default,
2023-12-29 00:58:19 +00:00
border: `1px solid #9A9AAF`,
// border: `1px solid ${theme.palette.grey2.main}`,
2023-12-16 14:55:56 +00:00
borderRadius: "8px",
}}
>
<UploadIcon />
<Box>
<Typography
sx={{
2023-12-29 00:58:19 +00:00
color: "#9A9AAF",
// color: theme.palette.grey2.main,
2023-12-16 14:55:56 +00:00
fontWeight: 500,
}}
>
{
UPLOAD_FILE_DESCRIPTIONS_MAP[currentQuestion.content.type]
.title
}
</Typography>
<Typography
sx={{
2023-12-29 00:58:19 +00:00
color: "#9A9AAF",
// color: theme.palette.grey2.main,
2023-12-16 14:55:56 +00:00
fontSize: "16px",
lineHeight: "19px",
}}
>
{
UPLOAD_FILE_DESCRIPTIONS_MAP[currentQuestion.content.type]
.description
}
</Typography>
</Box>
</Box>
</ButtonBase>
)}
{answer && currentQuestion.content.type === "picture" && (
<img
src={answer.split("|")[1]}
alt=""
style={{
marginTop: "15px",
maxWidth: "300px",
maxHeight: "300px",
}}
/>
)}
{answer && currentQuestion.content.type === "video" && (
<video
src={answer.split("|")[1]}
style={{
marginTop: "15px",
maxWidth: "300px",
maxHeight: "300px",
objectFit: "cover",
}}
/>
)}
</Box>
</Box>
);
2023-12-29 00:58:19 +00:00
2023-12-16 14:55:56 +00:00
};