import { useState, useRef, useEffect } from "react"; import { useParams } from "react-router-dom"; import { Box, Checkbox, FormControl, FormControlLabel, IconButton, InputAdornment, Paper, TextField, useMediaQuery, useTheme, } from "@mui/material"; import { useDebouncedCallback } from "use-debounce"; import { ChooseAnswerModal } from "./ChooseAnswerModal"; import TypeQuestions from "../TypeQuestions"; import SwitchQuestionsPage from "../SwitchQuestionsPage"; import { questionStore, updateQuestionsList, createQuestion, copyQuestion, removeQuestion, removeQuestionForce, } from "@root/questions"; import ExpandLessIcon from "@mui/icons-material/ExpandLess"; import { DeleteIcon } from "@icons/questionsPage/deleteIcon"; import { OneIcon } from "@icons/questionsPage/OneIcon"; import { PointsIcon } from "@icons/questionsPage/PointsIcon"; import { CopyIcon } from "@icons/questionsPage/CopyIcon"; import { CrossedEyeIcon } from "@icons/CrossedEyeIcon"; import { HideIcon } from "@icons/questionsPage/hideIcon"; import Answer from "@icons/questionsPage/answer"; import OptionsPict from "@icons/questionsPage/options_pict"; import OptionsAndPict from "@icons/questionsPage/options_and_pict"; import Emoji from "@icons/questionsPage/emoji"; import Input from "@icons/questionsPage/input"; import DropDown from "@icons/questionsPage/drop_down"; import Date from "@icons/questionsPage/date"; import Slider from "@icons/questionsPage/slider"; import Download from "@icons/questionsPage/download"; import Page from "@icons/questionsPage/page"; import RatingIcon from "@icons/questionsPage/rating"; import { ArrowDownIcon } from "@icons/questionsPage/ArrowDownIcon"; import { ReactComponent as PlusIcon } from "../../../assets/icons/plus.svg"; import type { DraggableProvidedDragHandleProps } from "react-beautiful-dnd"; import type { AnyQuizQuestion, QuizQuestionInitial, } from "../../../model/questionTypes/shared"; interface Props { totalIndex: number; draggableProps: DraggableProvidedDragHandleProps | null | undefined; isDragging: boolean; } const IconAndrom = (isExpanded: boolean, switchState: string) => { switch (switchState) { case "variant": return ( ); case "images": return ( ); case "varimg": return ( ); case "emoji": return ( ); case "text": return ( ); case "select": return ( ); case "date": return ( ); case "number": return ( ); case "file": return ( ); case "page": return ( ); case "rating": return ( ); default: return <>; } }; export default function QuestionsPageCard({ totalIndex, draggableProps, isDragging, }: Props) { const [plusVisible, setPlusVisible] = useState(false); const [open, setOpen] = useState(false); const quizId = Number(useParams().quizId); const theme = useTheme(); const isTablet = useMediaQuery(theme.breakpoints.down(1000)); const isMobile = useMediaQuery(theme.breakpoints.down(790)); const { listQuestions } = questionStore(); const question = listQuestions[quizId][totalIndex]; const anchorRef = useRef(null); const debounced = useDebouncedCallback((title) => { updateQuestionsList(quizId, totalIndex, { title }); }, 200); useEffect(() => { if (question.deleteTimeoutId) { clearTimeout(question.deleteTimeoutId); } }, [question]); return ( <> debounced(target.value)} InputProps={{ startAdornment: ( setOpen((isOpened) => !isOpened)} > {IconAndrom(question.expanded, question.type)} setOpen(false)} anchorRef={anchorRef} totalIndex={totalIndex} switchState={question.type} /> ), }} sx={{ margin: isMobile ? "10px 0" : 0, "& .MuiInputBase-root": { color: question.expanded ? "#9A9AAF" : "#4D4D4D", backgroundColor: question.expanded ? theme.palette.background.default : "transparent", height: "48px", borderRadius: "10px", ".MuiOutlinedInput-notchedOutline": { borderWidth: "1px !important", border: !question.expanded ? "none" : null, }, "& .MuiInputBase-input::placeholder": { color: "#4D4D4D", opacity: 0.8, }, }, }} inputProps={{ sx: { fontSize: "18px", lineHeight: "21px", py: 0, paddingLeft: question.type.length === 0 ? 0 : "18px", }, }} /> updateQuestionsList(quizId, totalIndex, { expanded: !question.expanded, }) } > {question.expanded ? ( ) : ( )} {question.expanded ? ( <> ) : ( } checkedIcon={} /> } label={""} sx={{ color: theme.palette.grey2.main, ml: "-9px", mr: 0, userSelect: "none", }} /> copyQuestion(quizId, totalIndex)} > { const removedId = question.id; if (question.deleteTimeoutId) { clearTimeout(question.deleteTimeoutId); } removeQuestion(quizId, totalIndex); const newTimeoutId = window.setTimeout(() => { removeQuestionForce(quizId, removedId); }, 5000); updateQuestionsList(quizId, totalIndex, { ...question, deleteTimeoutId: newTimeoutId, }); }} > )} {question.expanded && ( {question.type === "nonselected" ? ( ) : ( )} )} setPlusVisible(true)} onMouseLeave={() => setPlusVisible(false)} sx={{ maxWidth: "825px", display: "flex", alignItems: "center", height: "40px", cursor: "pointer", }} > createQuestion(quizId, "nonselected", totalIndex + 1)} sx={{ display: plusVisible && !isDragging ? "flex" : "none", width: "100%", alignItems: "center", columnGap: "10px", }} > ); }