import { useState } from "react"; import { Box, Typography, useMediaQuery, useTheme } from "@mui/material"; import { useDebouncedCallback } from "use-debounce"; import CustomNumberField from "@ui_kit/CustomNumberField"; import ButtonsOptions from "../ButtonsLayout/ButtonsOptions"; import SwitchSlider from "./switchSlider"; import { updateQuestion } from "@root/questions/actions"; import type { QuizQuestionNumber } from "@frontend/squzanswerer"; interface Props { question: QuizQuestionNumber; openBranchingPage: boolean; setOpenBranchingPage: (a: boolean) => void; } export default function SliderOptions({ question, openBranchingPage, setOpenBranchingPage }: Props) { const theme = useTheme(); const isTablet = useMediaQuery(theme.breakpoints.down(980)); const isMobile = useMediaQuery(theme.breakpoints.down(790)); const [switchState, setSwitchState] = useState("setting"); const [startError, setStartError] = useState(""); const [stepError, setStepError] = useState(""); const updateStartDebounced = useDebouncedCallback((value: number) => { setStartError(""); updateQuestion(question.id, (question) => { question.content.start = value; }); }, 5000); const updateStepDebounced = useDebouncedCallback((value: number) => { setStepError(""); updateQuestion(question.id, (question) => { question.content.step = value; }); }, 5000); const calculateValues = () => { const { step, start } = question.content; const [min, max] = question.content.range.split("—").map(Number); const minBorder = min <= max ? min : max; const maxBorder = max >= min ? max : min; const range = maxBorder - minBorder; const reversed = min > max; if (start < minBorder) { setStartError("Стартовое значени должно быть внутри диапазона"); updateStartDebounced(reversed ? max : min); } if (start > maxBorder) { setStartError("Стартовое значени должно быть внутри диапазона"); updateStartDebounced(reversed ? min : max); } if (!step) { setStepError("Стартовое значение должно быть больше 0"); updateStepDebounced(1); } if (step > maxBorder) { setStepError("Шаг не может выходить за пределы диапазона"); updateStepDebounced(1); } if (range % step) { setStepError(`Шаг должен делить без остатка диапазон ${maxBorder} - ${minBorder} = ${maxBorder - minBorder}`); updateStepDebounced(1); } }; return ( <> Выбор значения из диапазона { updateQuestion(question.id, (question) => { question.content.range = `${target.value}—${question.content.range.split("—")[1]}`; }); }} onBlur={calculateValues} /> { updateQuestion(question.id, (question) => { question.content.range = `${question.content.range.split("—")[0]}—${target.value}`; }); }} onBlur={calculateValues} /> Начальное значение { const newValue = Number(target.value); updateQuestion(question.id, (question) => { question.content.start = newValue; }); updateStartDebounced(newValue); }} onBlur={calculateValues} /> Шаг { if (type === "blur") { return; } const newValue = Number(target.value); updateQuestion(question.id, (question) => { question.content.step = newValue; }); updateStepDebounced(newValue); }} onBlur={calculateValues} /> ); }