import { useState, useEffect, useRef } from "react"; import { useParams } from "react-router-dom"; import { Box, Typography, TextField, useMediaQuery, useTheme, } from "@mui/material"; import { useDebouncedCallback } from "use-debounce"; import { questionStore, updateQuestionsList } from "@root/questions"; import ButtonsOptions from "../ButtonsOptions"; import SwitchRating from "./switchRating"; import TropfyIcon from "../../../assets/icons/questionsPage/tropfyIcon"; import FlagIcon from "../../../assets/icons/questionsPage/FlagIcon"; import HeartIcon from "../../../assets/icons/questionsPage/heartIcon"; import LikeIcon from "../../../assets/icons/questionsPage/likeIcon"; import LightbulbIcon from "../../../assets/icons/questionsPage/lightbulbIcon"; import HashtagIcon from "../../../assets/icons/questionsPage/hashtagIcon"; import StarIconMini from "../../../assets/icons/questionsPage/StarIconMini"; interface Props { totalIndex: number; } export type ButtonRatingFrom = { name: string; icon: JSX.Element; }; export default function RatingOptions({ totalIndex }: Props) { const [switchState, setSwitchState] = useState("setting"); const [negativeText, setNegativeText] = useState(""); const [positiveText, setPositiveText] = useState(""); const [negativeTextWidth, setNegativeTextWidth] = useState(0); const [positiveTextWidth, setPositiveTextWidth] = useState(0); const quizId = Number(useParams().quizId); const { listQuestions } = questionStore(); const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down(790)); const negativeRef = useRef(null); const positiveRef = useRef(null); const debounceNegativeDescription = useDebouncedCallback((value) => { updateQuestionsList(quizId, totalIndex, { content: { ...listQuestions[quizId][totalIndex].content, ratingNegativeDescription: value.substring(0, 15), }, }); }, 500); const debouncePositiveDescription = useDebouncedCallback((value) => { updateQuestionsList(quizId, totalIndex, { content: { ...listQuestions[quizId][totalIndex].content, ratingPositiveDescription: value.substring(0, 15), }, }); }, 500); useEffect(() => { setNegativeText( listQuestions[quizId][totalIndex].content.ratingNegativeDescription ); setPositiveText( listQuestions[quizId][totalIndex].content.ratingPositiveDescription ); }, []); useEffect(() => { setNegativeTextWidth(negativeRef.current?.offsetWidth || 0); }, [negativeText]); useEffect(() => { setPositiveTextWidth(positiveRef.current?.offsetWidth || 0); }, [positiveText]); const buttonRatingForm: ButtonRatingFrom[] = [ { name: "star", icon: }, { name: "trophie", icon: }, { name: "flag", icon: }, { name: "heart", icon: }, { name: "like", icon: }, { name: "bubble", icon: , }, { name: "hashtag", icon: }, ]; const SSHC = (data: string) => { setSwitchState(data); }; return ( <> negativeTextWidth + positiveTextWidth ? listQuestions[quizId][totalIndex].content.steps * 44 : negativeTextWidth + positiveTextWidth + 20 }px`, minWidth: "300px", maxWidth: "440px", display: "flex", px: "20px", flexDirection: "column", gap: "20px", }} > {Array.from( { length: listQuestions[quizId][totalIndex].content.steps }, (_, index) => index ).map((itemNumber) => ( { buttonRatingForm.find( ({ name }) => listQuestions[quizId][totalIndex].content.form === name )?.icon } ))} {negativeText} { if (target.value.length <= 15) { setNegativeText(target.value); debounceNegativeDescription(target.value); } }} onBlur={({ target }) => debounceNegativeDescription(target.value)} sx={{ width: negativeTextWidth + 10 + "px", background: "transparent", fontSize: "18px", minWidth: "95px", maxWidth: "230px", transition: "0.2s", "& .MuiInputBase-root": { "& .MuiInputBase-input": { color: theme.palette.grey2.main, fontSize: "16px", padding: "0 3px", borderRadius: "3px", border: "1px solid", borderColor: "transparent", "&:hover, &:focus": { borderColor: theme.palette.grey2.main, }, }, "& .MuiOutlinedInput-notchedOutline": { outline: "none", border: "none", }, }, }} /> {positiveText} { if (target.value.length <= 15) { setPositiveText(target.value); debouncePositiveDescription(target.value); } }} onBlur={({ target }) => debouncePositiveDescription(target.value)} sx={{ width: positiveTextWidth + 10 + "px", background: "transparent", fontSize: "18px", minWidth: "95px", maxWidth: "230px", transition: "0.2s", "& .MuiInputBase-root": { "& .MuiInputBase-input": { color: theme.palette.grey2.main, fontSize: "16px", padding: "0 3px", borderRadius: "3px", border: "1px solid", borderColor: "transparent", "&:hover, &:focus": { borderColor: theme.palette.grey2.main, }, }, "& .MuiOutlinedInput-notchedOutline": { outline: "none", border: "none", }, }, }} /> ); }