frontPanel/src/pages/Questions/OptionsAndPicture/OptionsAndPicture.tsx

195 lines
5.9 KiB
TypeScript
Raw Normal View History

import { Box, Link, Typography, useMediaQuery, useTheme } from "@mui/material";
2023-12-31 02:53:25 +00:00
import {
addQuestionVariant,
2024-04-06 17:23:01 +00:00
clearQuestionImages,
2023-12-31 02:53:25 +00:00
uploadQuestionImage,
} from "@root/questions/actions";
2023-12-02 09:35:35 +00:00
import { useCurrentQuiz } from "@root/quizes/hooks";
2023-12-04 11:57:54 +00:00
import { CropModal, useCropModalState } from "@ui_kit/Modal/CropModal";
import { useEffect, useState } from "react";
2023-10-19 10:34:48 +00:00
import { EnterIcon } from "../../../assets/icons/questionsPage/enterIcon";
import type { QuizQuestionVarImg } from "../../../model/questionTypes/varimg";
import { useDisclosure } from "../../../utils/useDisclosure";
import { AnswerDraggableList } from "../AnswerDraggableList";
import ImageEditAnswerItem from "../AnswerDraggableList/ImageEditAnswerItem";
2023-10-19 10:34:48 +00:00
import ButtonsOptionsAndPict from "../ButtonsOptionsAndPict";
import { UploadImageModal } from "../UploadImage/UploadImageModal";
2023-10-19 10:34:48 +00:00
import SwitchOptionsAndPict from "./switchOptionsAndPict";
2023-09-21 07:00:08 +00:00
interface Props {
2023-12-31 02:53:25 +00:00
question: QuizQuestionVarImg;
openBranchingPage: boolean;
setOpenBranchingPage: (a: boolean) => void;
}
export default function OptionsAndPicture({
question,
setOpenBranchingPage,
}: Props) {
2023-12-31 02:53:25 +00:00
const [switchState, setSwitchState] = useState("setting");
2024-01-18 14:21:09 +00:00
const [pictureUploding, setPictureUploading] = useState<boolean>(false);
2023-12-31 02:53:25 +00:00
const [selectedVariantId, setSelectedVariantId] = useState<string | null>(
null,
);
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down(790));
const quizQid = useCurrentQuiz()?.qid;
const [isImageUploadOpen, openImageUploadModal, closeImageUploadModal] =
useDisclosure();
const {
isCropModalOpen,
openCropModal,
closeCropModal,
imageBlob,
originalImageUrl,
setCropModalImageBlob,
} = useCropModalState();
2023-09-15 12:37:12 +00:00
2023-12-31 02:53:25 +00:00
const handleImageUpload = async (file: File) => {
if (!selectedVariantId) return;
2023-10-01 12:48:39 +00:00
2024-01-18 14:21:09 +00:00
setPictureUploading(true);
2024-01-19 11:22:48 +00:00
const url = await uploadQuestionImage(
question.id,
quizQid,
file,
(question, url) => {
if (!("variants" in question.content)) return;
2024-01-18 14:21:09 +00:00
2024-01-19 11:22:48 +00:00
const variant = question.content.variants.find(
(variant) => variant.id === selectedVariantId,
);
if (!variant) return;
2024-01-18 14:21:09 +00:00
2024-01-19 11:22:48 +00:00
variant.extendedText = url;
variant.originalImageUrl = url;
},
);
closeImageUploadModal();
openCropModal(file, url);
2024-01-18 14:21:09 +00:00
setPictureUploading(false);
2023-12-31 02:53:25 +00:00
};
2023-12-31 02:53:25 +00:00
function handleCropModalSaveClick(imageBlob: Blob) {
if (!selectedVariantId) return;
2023-12-01 18:05:59 +00:00
2023-12-31 02:53:25 +00:00
uploadQuestionImage(question.id, quizQid, imageBlob, (question, url) => {
if (!("variants" in question.content)) return;
2023-12-01 18:05:59 +00:00
2023-12-31 02:53:25 +00:00
const variant = question.content.variants.find(
(variant) => variant.id === selectedVariantId,
);
if (!variant) return;
2023-10-01 12:48:39 +00:00
2023-12-31 02:53:25 +00:00
variant.extendedText = url;
});
}
useEffect(() => {
if (question.deleteTimeoutId) {
clearTimeout(question.deleteTimeoutId);
}
}, [question]);
2023-12-31 02:53:25 +00:00
return (
<>
<Box sx={{ pl: "20px", pr: "20px" }}>
<AnswerDraggableList
questionId={question.id}
variants={question.content.variants.map((variant, index) => (
<ImageEditAnswerItem
key={variant.id}
index={index}
disableKeyDown={question.content.variants.length >= 100}
questionId={question.id}
largeCheck={question.content.largeCheck}
variant={variant}
isMobile={isMobile}
openCropModal={openCropModal}
openImageUploadModal={openImageUploadModal}
pictureUploding={pictureUploding}
setSelectedVariantId={setSelectedVariantId}
/>
))}
2023-12-31 02:53:25 +00:00
/>
<UploadImageModal
isOpen={isImageUploadOpen}
onClose={closeImageUploadModal}
handleImageChange={handleImageUpload}
/>
<CropModal
isOpen={isCropModalOpen}
imageBlob={imageBlob}
originalImageUrl={originalImageUrl}
setCropModalImageBlob={setCropModalImageBlob}
onClose={closeCropModal}
onSaveImageClick={handleCropModalSaveClick}
2024-04-06 17:23:01 +00:00
onDeleteClick={() => {
if (selectedVariantId)
clearQuestionImages(question.id, selectedVariantId);
}}
2024-05-21 08:21:38 +00:00
cropAspectRatio={{ width: 300, height: 300 }}
2023-12-31 02:53:25 +00:00
/>
<Box
sx={{
display: "flex",
alignItems: "center",
marginBottom: "17px",
}}
>
<Link
component="button"
variant="body2"
sx={{
color: theme.palette.brightPurple.main,
fontWeight: "400",
fontSize: "16px",
mr: "4px",
height: "19px",
}}
onClick={() => {
addQuestionVariant(question.id);
}}
>
Добавьте ответ
</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>
<ButtonsOptionsAndPict
switchState={switchState}
SSHC={setSwitchState}
questionId={question.id}
questionContentId={question.content.id}
questionHasParent={question.content.rule.parentId.length !== 0}
questionType={question.type}
openBranchingPage={false}
setOpenBranchingPage={setOpenBranchingPage}
2023-12-31 02:53:25 +00:00
/>
<SwitchOptionsAndPict switchState={switchState} question={question} />
</>
);
2023-08-12 08:31:21 +00:00
}