frontPanel/src/pages/Questions/OptionsPicture/OptionsPicture.tsx

168 lines
6.9 KiB
TypeScript
Raw Normal View History

2023-09-20 17:39:17 +00:00
import {
2023-11-15 18:38:02 +00:00
Box,
Link,
Typography,
useMediaQuery,
useTheme
2023-09-20 17:39:17 +00:00
} from "@mui/material";
2023-11-15 18:38:02 +00:00
import { openCropModal } from "@root/cropModal";
import { setVariantImageUrl, setVariantOriginalImageUrl, updateQuestionsList } from "@root/questions";
import AddOrEditImageButton from "@ui_kit/AddOrEditImageButton";
import { CropModal } from "@ui_kit/Modal/CropModal";
2023-10-19 10:34:48 +00:00
import { useState } from "react";
import { useParams } from "react-router-dom";
2023-11-15 18:38:02 +00:00
import { EnterIcon } from "../../../assets/icons/questionsPage/enterIcon";
import type { QuizQuestionImages } from "../../../model/questionTypes/images";
2023-10-19 10:34:48 +00:00
import { AnswerDraggableList } from "../AnswerDraggableList";
import ButtonsOptions from "../ButtonsOptions";
2023-10-01 12:10:12 +00:00
import { UploadImageModal } from "../UploadImage/UploadImageModal";
import SwitchAnswerOptionsPict from "./switchOptionsPict";
2023-09-21 07:00:08 +00:00
2023-10-03 14:03:57 +00:00
2023-08-24 11:09:47 +00:00
interface Props {
2023-11-15 18:38:02 +00:00
question: QuizQuestionImages;
2023-08-24 11:09:47 +00:00
}
2023-08-28 11:03:25 +00:00
2023-11-15 18:38:02 +00:00
export default function OptionsPicture({ question }: Props) {
2023-10-19 10:34:48 +00:00
const [isUploadImageModalOpen, setIsUploadImageModalOpen] = useState(false);
2023-10-12 15:20:46 +00:00
const [currentIndex, setCurrentIndex] = useState<number>(0);
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down(790));
const quizId = Number(useParams().quizId);
const [switchState, setSwitchState] = useState("setting");
2023-08-28 11:03:25 +00:00
2023-11-15 18:38:02 +00:00
const SSHC = (data: string) => {
setSwitchState(data);
};
2023-10-23 15:48:27 +00:00
const handleImageUpload = (files: FileList | null) => {
if (!files?.length) return;
2023-08-28 11:03:25 +00:00
2023-10-23 15:48:27 +00:00
const [file] = Array.from(files);
const url = URL.createObjectURL(file);
2023-10-01 12:10:12 +00:00
2023-10-23 15:48:27 +00:00
setVariantImageUrl(quizId, totalIndex, currentIndex, url);
setVariantOriginalImageUrl(quizId, totalIndex, currentIndex, url);
setIsUploadImageModalOpen(false);
openCropModal(url, url);
2023-10-12 15:20:46 +00:00
};
2023-08-28 11:03:25 +00:00
2023-10-12 15:20:46 +00:00
const addNewAnswer = () => {
const answerNew = question.content.variants.slice();
answerNew.push({ answer: "", hints: "", extendedText: "", originalImageUrl: "" });
2023-08-28 11:03:25 +00:00
2023-11-15 18:38:02 +00:00
updateQuestionsList<QuizQuestionImages>(quizId, totalIndex, {
content: { ...question.content, variants: answerNew },
});
};
2023-08-28 11:03:25 +00:00
2023-10-23 15:48:27 +00:00
function handleCropModalSaveClick(url: string) {
setVariantImageUrl(quizId, totalIndex, currentIndex, url);
}
2023-10-12 15:20:46 +00:00
return (
2023-11-15 18:38:02 +00:00
<>
<Box sx={{ padding: "20px" }}>
<AnswerDraggableList
variants={question.content.variants}
question={totalIndex}
additionalContent={(variant, index) => (
<>
{!isMobile && (
<AddOrEditImageButton
imageSrc={variant.extendedText}
onImageClick={() => {
if (!("originalImageUrl" in variant)) return;
setCurrentIndex(index);
if (variant.extendedText) {
return openCropModal(
variant.extendedText,
variant.originalImageUrl
);
}
setIsUploadImageModalOpen(true);
}}
onPlusClick={() => {
setCurrentIndex(index);
setIsUploadImageModalOpen(true);
}}
sx={{ mx: "10px" }}
/>
)}
</>
)}
additionalMobile={(variant, index) => (
<>
{isMobile && (
<AddOrEditImageButton
imageSrc={variant.extendedText}
onImageClick={() => {
if (!("originalImageUrl" in variant)) return;
setCurrentIndex(index);
if (variant.extendedText) {
return openCropModal(
variant.extendedText,
variant.originalImageUrl
);
}
setIsUploadImageModalOpen(true);
}}
onPlusClick={() => {
setCurrentIndex(index);
setIsUploadImageModalOpen(true);
}}
sx={{ m: "8px", width: "auto" }}
/>
)}
</>
)}
/>
<UploadImageModal
open={isUploadImageModalOpen}
onClose={() => setIsUploadImageModalOpen(false)}
imgHC={handleImageUpload}
/>
<CropModal onSaveImageClick={handleCropModalSaveClick} />
<Box sx={{ display: "flex", alignItems: "center", gap: "10px" }}>
<Link
component="button"
variant="body2"
sx={{ color: theme.palette.brightPurple.main }}
onClick={addNewAnswer}
>
Добавьте ответ
</Link>
{isMobile ? null : (
<>
<Typography
sx={{
fontWeight: 400,
lineHeight: "21.33px",
color: theme.palette.grey2.main,
fontSize: "16px",
}}
>
или нажмите Enter
</Typography>
<EnterIcon
style={{
color: "#7E2AEA",
fontSize: "24px",
marginLeft: "6px",
}}
/>
</>
)}
</Box>
</Box>
<ButtonsOptions switchState={switchState} SSHC={SSHC} totalIndex={totalIndex} />
<SwitchAnswerOptionsPict switchState={switchState} totalIndex={totalIndex} />
</>
);
2023-08-24 11:09:47 +00:00
}