diff --git a/ CHANGELOG.md b/ CHANGELOG.md new file mode 100644 index 00000000..dcee8de5 --- /dev/null +++ b/ CHANGELOG.md @@ -0,0 +1 @@ +1.0.0 Добавлены фичи "мультиответ", "перенос строки в своём ответе", "свой ответ", "плейсхолдер своего ответа" \ No newline at end of file diff --git a/src/model/questionTypes/shared.ts b/src/model/questionTypes/shared.ts index e85692af..43679060 100644 --- a/src/model/questionTypes/shared.ts +++ b/src/model/questionTypes/shared.ts @@ -30,6 +30,17 @@ export function createQuestionVariant(): QuestionVariant { answer: "", extendedText: "", hints: "", + isOwn: false, + originalImageUrl: "", + }; +} +export function createQuestionOwnVariant(): QuestionVariant { + return { + id: nanoid(), + answer: "", + extendedText: "", + hints: "", + isOwn: true, originalImageUrl: "", }; } diff --git a/src/pages/ContactFormPage/ButtonSettingForms.tsx b/src/pages/ContactFormPage/ButtonSettingForms.tsx index 023fbf5d..d6614e51 100644 --- a/src/pages/ContactFormPage/ButtonSettingForms.tsx +++ b/src/pages/ContactFormPage/ButtonSettingForms.tsx @@ -7,10 +7,10 @@ import SupplementIcon from "../../assets/icons/ContactFormIcon/supplementIcon"; interface Props { switchState: string; - SSHC: (data: string) => void; + setSwitchState: (data: string) => void; } -export default function ButtonSettingForms({ SSHC, switchState }: Props) { +export default function ButtonSettingForms({ setSwitchState, switchState }: Props) { const theme = useTheme(); const buttonSetting: { icon: JSX.Element; title: string; value: string }[] = [ { @@ -68,7 +68,7 @@ export default function ButtonSettingForms({ SSHC, switchState }: Props) { { - SSHC(e.value); + setSwitchState(e.value); }} sx={{ backgroundColor: diff --git a/src/pages/IntegrationsPage/IntegrationsModal/Amo/AnswerItem.tsx b/src/pages/IntegrationsPage/IntegrationsModal/Amo/AnswerItem.tsx index a237cd7c..b2e7545d 100644 --- a/src/pages/IntegrationsPage/IntegrationsModal/Amo/AnswerItem.tsx +++ b/src/pages/IntegrationsPage/IntegrationsModal/Amo/AnswerItem.tsx @@ -9,8 +9,6 @@ type AnswerItemProps = { }; export const AnswerItem: FC = ({ fieldName, fieldValue, deleteHC }) => { - console.log("AnswerItem") - console.log(fieldName) const theme = useTheme(); return ( = ({ selectedTags, }) => { const theme = useTheme(); - console.log(step) const isMobile = useMediaQuery(theme.breakpoints.down(600)); if (step === 0) { return; diff --git a/src/pages/Landing/Tariffs/Tariffs.tsx b/src/pages/Landing/Tariffs/Tariffs.tsx index 8628e66c..96dfe63c 100644 --- a/src/pages/Landing/Tariffs/Tariffs.tsx +++ b/src/pages/Landing/Tariffs/Tariffs.tsx @@ -59,7 +59,7 @@ export const Tariffs = () => { type: "duration", description: "30 дней безлимитного пользования сервисом", actualPrice: "969", - oldPrice: "1024", + oldPrice: "1020", discount: "5", }, { @@ -99,7 +99,7 @@ export const Tariffs = () => { type: "requests", description: "Полное прохождение 1000 опросов респондентом", actualPrice: "12 740", - oldPrice: "2 000", + oldPrice: "20 000", discount: "36", }, { diff --git a/src/pages/Questions/AnswerDraggableList/AnswerItem.tsx b/src/pages/Questions/AnswerDraggableList/AnswerItem.tsx index 1b22b6aa..80d96dad 100644 --- a/src/pages/Questions/AnswerDraggableList/AnswerItem.tsx +++ b/src/pages/Questions/AnswerDraggableList/AnswerItem.tsx @@ -10,11 +10,11 @@ import { useMediaQuery, useTheme, } from "@mui/material"; -import { addQuestionVariant, deleteQuestionVariant, setQuestionVariantField } from "@root/questions/actions"; +import { addQuestionVariant, deleteQuestionVariant, setQuestionVariantField, updateQuestion } from "@root/questions/actions"; import { enqueueSnackbar } from "notistack"; import { memo, type ChangeEvent, type FC, type KeyboardEvent, type ReactNode } from "react"; import { Draggable } from "react-beautiful-dnd"; -import type { QuestionVariant } from "@frontend/squzanswerer"; +import type { QuestionVariant, QuizQuestionVariant } from "@frontend/squzanswerer"; const TextField = MuiTextField as unknown as FC; @@ -26,13 +26,22 @@ type AnswerItemProps = { disableKeyDown?: boolean; additionalContent?: ReactNode; additionalMobile?: ReactNode; + isOwn: boolean; + ownPlaceholder: string; }; const AnswerItem = memo( - ({ index, variant, questionId, largeCheck = false, additionalContent, additionalMobile, disableKeyDown }) => { + ({ index, variant, questionId, largeCheck = false, additionalContent, additionalMobile, disableKeyDown, isOwn, ownPlaceholder }) => { const theme = useTheme(); const isTablet = useMediaQuery(theme.breakpoints.down(790)); + const setOwnPlaceholder = (replText: string) => { + updateQuestion(questionId, (question) => { + question.content.ownPlaceholder = replText; + console.log(question) + }); + }; + return ( ( }} > ) => { if (target.value.length <= 1000) { + isOwn ? + setOwnPlaceholder(target.value || " ") + : setQuestionVariantField(questionId, variant.id, "answer", target.value || " "); } }} onKeyDown={(event: KeyboardEvent) => { if (disableKeyDown) { - enqueueSnackbar("100 максимальное количество вопросов"); + enqueueSnackbar("100 максимальное количество"); } else if (event.code === "Enter" && !largeCheck) { addQuestionVariant(questionId); } @@ -88,7 +100,13 @@ const AnswerItem = memo( deleteQuestionVariant(questionId, variant.id)} + onClick={() => { + isOwn ? updateQuestion(questionId, (question) => { + question.content.own = false; + }) + : + deleteQuestionVariant(questionId, variant.id) + }} > ( "& .MuiInputBase-root": { padding: additionalContent ? "5px 13px" : "13px", borderRadius: "10px", - background: "#ffffff", + background: isOwn ? "#F2F3F7" : "white", "& input.MuiInputBase-input": { height: "22px", }, diff --git a/src/pages/Questions/AnswerDraggableList/ImageEditAnswerItem.tsx b/src/pages/Questions/AnswerDraggableList/ImageEditAnswerItem.tsx index 7e45d691..d019b07e 100644 --- a/src/pages/Questions/AnswerDraggableList/ImageEditAnswerItem.tsx +++ b/src/pages/Questions/AnswerDraggableList/ImageEditAnswerItem.tsx @@ -14,6 +14,8 @@ type Props = Omit< originalImageUrl?: string | null | undefined, ) => Promise; openImageUploadModal: () => void; + isOwn: boolean; + ownPlaceholder: string; }; export default function ImageEditAnswerItem({ @@ -27,6 +29,8 @@ export default function ImageEditAnswerItem({ pictureUploding, openCropModal, openImageUploadModal, + isOwn, + ownPlaceholder, }: Props) { const addOrEditImageButton = useMemo(() => { return ( @@ -105,6 +109,8 @@ export default function ImageEditAnswerItem({ variant={variant} additionalContent={addOrEditImageButton} additionalMobile={addOrEditImageButtonMobile} + isOwn={isOwn} + ownPlaceholder={ownPlaceholder} /> ); } diff --git a/src/pages/Questions/BranchingMap/CsComponent.tsx b/src/pages/Questions/Branching/BranchingMap/CsComponent.tsx similarity index 100% rename from src/pages/Questions/BranchingMap/CsComponent.tsx rename to src/pages/Questions/Branching/BranchingMap/CsComponent.tsx diff --git a/src/pages/Questions/BranchingMap/CsNodeButtons.tsx b/src/pages/Questions/Branching/BranchingMap/CsNodeButtons.tsx similarity index 100% rename from src/pages/Questions/BranchingMap/CsNodeButtons.tsx rename to src/pages/Questions/Branching/BranchingMap/CsNodeButtons.tsx diff --git a/src/pages/Questions/BranchingMap/FirstNodeField.tsx b/src/pages/Questions/Branching/BranchingMap/FirstNodeField.tsx similarity index 100% rename from src/pages/Questions/BranchingMap/FirstNodeField.tsx rename to src/pages/Questions/Branching/BranchingMap/FirstNodeField.tsx diff --git a/src/pages/Questions/BranchingMap/InfoBanner/InfoBanner.tsx b/src/pages/Questions/Branching/BranchingMap/InfoBanner/InfoBanner.tsx similarity index 100% rename from src/pages/Questions/BranchingMap/InfoBanner/InfoBanner.tsx rename to src/pages/Questions/Branching/BranchingMap/InfoBanner/InfoBanner.tsx diff --git a/src/pages/Questions/BranchingMap/PositionControl/PositionControl.tsx b/src/pages/Questions/Branching/BranchingMap/PositionControl/PositionControl.tsx similarity index 100% rename from src/pages/Questions/BranchingMap/PositionControl/PositionControl.tsx rename to src/pages/Questions/Branching/BranchingMap/PositionControl/PositionControl.tsx diff --git a/src/pages/Questions/BranchingMap/ZoomControl/ZoomControl.tsx b/src/pages/Questions/Branching/BranchingMap/ZoomControl/ZoomControl.tsx similarity index 100% rename from src/pages/Questions/BranchingMap/ZoomControl/ZoomControl.tsx rename to src/pages/Questions/Branching/BranchingMap/ZoomControl/ZoomControl.tsx diff --git a/src/pages/Questions/BranchingMap/helper.ts b/src/pages/Questions/Branching/BranchingMap/helper.ts similarity index 100% rename from src/pages/Questions/BranchingMap/helper.ts rename to src/pages/Questions/Branching/BranchingMap/helper.ts diff --git a/src/pages/Questions/BranchingMap/hooks/usePopper.ts b/src/pages/Questions/Branching/BranchingMap/hooks/usePopper.ts similarity index 100% rename from src/pages/Questions/BranchingMap/hooks/usePopper.ts rename to src/pages/Questions/Branching/BranchingMap/hooks/usePopper.ts diff --git a/src/pages/Questions/BranchingMap/hooks/useRemoveNode.ts b/src/pages/Questions/Branching/BranchingMap/hooks/useRemoveNode.ts similarity index 100% rename from src/pages/Questions/BranchingMap/hooks/useRemoveNode.ts rename to src/pages/Questions/Branching/BranchingMap/hooks/useRemoveNode.ts diff --git a/src/pages/Questions/BranchingMap/index.tsx b/src/pages/Questions/Branching/BranchingMap/index.tsx similarity index 100% rename from src/pages/Questions/BranchingMap/index.tsx rename to src/pages/Questions/Branching/BranchingMap/index.tsx diff --git a/src/pages/Questions/BranchingMap/nameCutter.ts b/src/pages/Questions/Branching/BranchingMap/nameCutter.ts similarity index 100% rename from src/pages/Questions/BranchingMap/nameCutter.ts rename to src/pages/Questions/Branching/BranchingMap/nameCutter.ts diff --git a/src/pages/Questions/BranchingMap/style/styles.css b/src/pages/Questions/Branching/BranchingMap/style/styles.css similarity index 92% rename from src/pages/Questions/BranchingMap/style/styles.css rename to src/pages/Questions/Branching/BranchingMap/style/styles.css index fe965139..a1683d74 100644 --- a/src/pages/Questions/BranchingMap/style/styles.css +++ b/src/pages/Questions/Branching/BranchingMap/style/styles.css @@ -38,7 +38,7 @@ align-items: center; justify-content: center; border-radius: 6px; - background-image: url("../../../../assets/icons/ArrowGear.svg"); + background-image: url("../../../../../assets/icons/ArrowGear.svg"); font-size: 0px; background-repeat: no-repeat; background-size: contain; diff --git a/src/pages/Questions/BranchingMap/style/stylesheet.ts b/src/pages/Questions/Branching/BranchingMap/style/stylesheet.ts similarity index 100% rename from src/pages/Questions/BranchingMap/style/stylesheet.ts rename to src/pages/Questions/Branching/BranchingMap/style/stylesheet.ts diff --git a/src/pages/Questions/BranchingModal/BranchingQuestionsModal.tsx b/src/pages/Questions/Branching/BranchingModal/BranchingQuestionsModal.tsx similarity index 99% rename from src/pages/Questions/BranchingModal/BranchingQuestionsModal.tsx rename to src/pages/Questions/Branching/BranchingModal/BranchingQuestionsModal.tsx index 834608c5..80ac87ce 100644 --- a/src/pages/Questions/BranchingModal/BranchingQuestionsModal.tsx +++ b/src/pages/Questions/Branching/BranchingModal/BranchingQuestionsModal.tsx @@ -11,7 +11,7 @@ import { useMediaQuery, useTheme, } from "@mui/material"; -import { createBranchingRuleMain } from "../../../model/questionTypes/shared"; +import { createBranchingRuleMain } from "../../../../model/questionTypes/shared"; import InfoIcon from "@icons/Info"; import { TypeSwitch } from "./Settings"; diff --git a/src/pages/Questions/BranchingModal/Settings.tsx b/src/pages/Questions/Branching/BranchingModal/Settings.tsx similarity index 100% rename from src/pages/Questions/BranchingModal/Settings.tsx rename to src/pages/Questions/Branching/BranchingModal/Settings.tsx diff --git a/src/pages/Questions/BranchingPanel/index.tsx b/src/pages/Questions/Branching/BranchingPanel/index.tsx similarity index 100% rename from src/pages/Questions/BranchingPanel/index.tsx rename to src/pages/Questions/Branching/BranchingPanel/index.tsx diff --git a/src/pages/Questions/BranchingQuestionsModal/index.tsx b/src/pages/Questions/Branching/BranchingQuestionsModal/index.tsx similarity index 100% rename from src/pages/Questions/BranchingQuestionsModal/index.tsx rename to src/pages/Questions/Branching/BranchingQuestionsModal/index.tsx diff --git a/src/pages/Questions/DeleteNodeModal/index.tsx b/src/pages/Questions/Branching/DeleteNodeModal/index.tsx similarity index 100% rename from src/pages/Questions/DeleteNodeModal/index.tsx rename to src/pages/Questions/Branching/DeleteNodeModal/index.tsx diff --git a/src/pages/Questions/QuestionSwitchWindowTool.tsx b/src/pages/Questions/Branching/QuestionSwitchWindowTool.tsx similarity index 97% rename from src/pages/Questions/QuestionSwitchWindowTool.tsx rename to src/pages/Questions/Branching/QuestionSwitchWindowTool.tsx index 95687b43..390c1d1d 100644 --- a/src/pages/Questions/QuestionSwitchWindowTool.tsx +++ b/src/pages/Questions/Branching/QuestionSwitchWindowTool.tsx @@ -1,7 +1,7 @@ import { Box, Skeleton, useMediaQuery, useTheme } from "@mui/material"; import { deleteTimeoutedQuestions } from "@utils/deleteTimeoutedQuestions"; import { lazy, Suspense, useCallback } from "react"; -import { DraggableList } from "./DraggableList"; +import { DraggableList } from "../DraggableList"; import { SwitchBranchingPanel } from "./SwitchBranchingPanel"; const BranchingMap = lazy(() => diff --git a/src/pages/Questions/SwitchBranchingPanel/QuestionsList.tsx b/src/pages/Questions/Branching/SwitchBranchingPanel/QuestionsList.tsx similarity index 100% rename from src/pages/Questions/SwitchBranchingPanel/QuestionsList.tsx rename to src/pages/Questions/Branching/SwitchBranchingPanel/QuestionsList.tsx diff --git a/src/pages/Questions/SwitchBranchingPanel/index.tsx b/src/pages/Questions/Branching/SwitchBranchingPanel/index.tsx similarity index 100% rename from src/pages/Questions/SwitchBranchingPanel/index.tsx rename to src/pages/Questions/Branching/SwitchBranchingPanel/index.tsx diff --git a/src/pages/Questions/DropDown/DropDown.tsx b/src/pages/Questions/DropDown/DropDown.tsx index b1fe9e49..fd6640c9 100644 --- a/src/pages/Questions/DropDown/DropDown.tsx +++ b/src/pages/Questions/DropDown/DropDown.tsx @@ -3,7 +3,7 @@ import { useCallback, useState } from "react"; import { EnterIcon } from "../../../assets/icons/questionsPage/enterIcon"; import { useAddAnswer } from "../../../utils/hooks/useAddAnswer"; import { AnswerDraggableList } from "../AnswerDraggableList"; -import ButtonsOptions from "../ButtonsOptions"; +import ButtonsOptions from "../QuestionOptions/ButtonsLayout/ButtonsOptions"; import SwitchDropDown from "./switchDropDown"; import type { QuizQuestionSelect } from "@frontend/squzanswerer"; @@ -100,7 +100,7 @@ export default function DropDown({ question, openBranchingPage, setOpenBranching ("setting"); - const onClickAddAnAnswer = useAddAnswer(); + const {onClickAddAnAnswer} = useAddAnswer(); const [open, setOpen] = useState(false); const [anchorElement, setAnchorElement] = useState(null); const [selectedVariant, setSelectedVariant] = useState(null); @@ -29,9 +29,12 @@ export default function Emoji({ question, openBranchingPage, setOpenBranchingPag return ( <> + ( + variants={question.content.variants + .filter(variant => !variant.isOwn ? true : question.content.own && variant.isOwn) + .map((variant, index) => ( ))} /> + , @@ -11,6 +12,8 @@ type Props = Omit< setAnchorElement: React.Dispatch>; setSelectedVariant: React.Dispatch>; setOpen: React.Dispatch>; + isOwn: boolean; + ownPlaceholder: string; }; export default function EmojiAnswerItem({ @@ -23,7 +26,11 @@ export default function EmojiAnswerItem({ setAnchorElement, setSelectedVariant, setOpen, + isOwn, + ownPlaceholder, }: Props) { + + const addOrEditImageButton = useMemo(() => { return ( !isTablet && ( @@ -77,6 +84,8 @@ export default function EmojiAnswerItem({ variant={variant} additionalContent={addOrEditImageButton} additionalMobile={addOrEditImageButtonMobile} + isOwn={isOwn} + ownPlaceholder={ownPlaceholder} /> ); } diff --git a/src/pages/Questions/Emoji/settingEmoji.tsx b/src/pages/Questions/Emoji/settingEmoji.tsx index 827cdb93..1cff9275 100644 --- a/src/pages/Questions/Emoji/settingEmoji.tsx +++ b/src/pages/Questions/Emoji/settingEmoji.tsx @@ -1,23 +1,37 @@ -import type { QuizQuestionEmoji, QuizQuestionVariant } from "@frontend/squzanswerer"; +import type { QuestionType, QuizQuestionEmoji, QuizQuestionVariant } from "@frontend/squzanswerer"; import { Box, Typography, useMediaQuery, useTheme } from "@mui/material"; import { updateQuestion } from "@root/questions/actions"; import CustomCheckbox from "@ui_kit/CustomCheckbox"; import { memo } from "react"; +import CustomTextField from "@ui_kit/CustomTextField"; +import { useAddAnswer } from "@/utils/hooks/useAddAnswer"; type SettingEmojiProps = { + question: QuizQuestionEmoji; questionId: string; isRequired: boolean; isMulti: boolean; isOwn: boolean; + isLargeCheck?: boolean; }; -const SettingEmoji = memo(function ({ questionId, isRequired, isMulti, isOwn }) { +const SettingEmoji = memo(function ({ question, questionId, isRequired, isLargeCheck, isMulti, isOwn }) { const theme = useTheme(); + const {switchOwn} = useAddAnswer(); + const isWrappColumn = useMediaQuery(theme.breakpoints.down(980)); const isFigmaTablte = useMediaQuery(theme.breakpoints.down(990)); const isTablet = useMediaQuery(theme.breakpoints.down(985)); const isMobile = useMediaQuery(theme.breakpoints.down(790)); + const setOwnPlaceholder = (replText: string) => { + updateQuestion(questionId, (question) => { + if (question.type !== "varimg") return; + + question.content.ownPlaceholder = replText; + }); + }; + return ( (function ({ questionId, isRequired, pt: isTablet ? "5px" : "0px", }} > - {/* (function ({ questionId, isRequired, > Настройки ответов + {/* { + updateQuestion(questionId, (question) => { + question.content.largeCheck = target.checked; + }); + }} + /> */} (function ({ questionId, isRequired, label={'Вариант "свой ответ"'} checked={isOwn} handleChange={({ target }) => { - updateQuestion(questionId, (question) => { - question.content.own = target.checked; - }); + switchOwn({question, checked:target.checked}) }} /> - */} + {/* + + Подсказка "своего ответа" + + setOwnPlaceholder(target.value)} + /> + */} + ); case "help": diff --git a/src/pages/Questions/OwnTextField/OwnTextField.tsx b/src/pages/Questions/OwnTextField/OwnTextField.tsx index 92f96647..9de2e7f0 100644 --- a/src/pages/Questions/OwnTextField/OwnTextField.tsx +++ b/src/pages/Questions/OwnTextField/OwnTextField.tsx @@ -5,7 +5,7 @@ import TooltipClickInfo from "@ui_kit/Toolbars/TooltipClickInfo"; import { useEffect, useState } from "react"; import InfoIcon from "../../../assets/icons/InfoIcon"; import type { QuizQuestionText } from "@frontend/squzanswerer"; -import ButtonsOptionsAndPict from "../ButtonsOptionsAndPict"; +import ButtonsOptions from "../QuestionOptions/ButtonsLayout/ButtonsOptions"; import SwitchTextField from "./switchTextField"; interface Props { @@ -90,9 +90,9 @@ export default function OwnTextField({ question, openBranchingPage, setOpenBranc )} - void; + setSwitchState: (data: string) => void; openBranchingPage: boolean; setOpenBranchingPage: (a: boolean) => void; questionId: string; questionType: QuestionType; questionContentId: string; questionHasParent: boolean; -} +}; -const ButtonsOptionsAndPict = memo(function ({ - SSHC, +const IgnoreImage = ["images", "emoji", "number", "date", "select", "text", "file", "rating"] + +const ButtonsOptions = memo(function ({ + setSwitchState, switchState, openBranchingPage, setOpenBranchingPage, @@ -47,17 +51,17 @@ const ButtonsOptionsAndPict = memo(function ({ questionContentId, questionHasParent, }) { - const [buttonHover, setButtonHover] = useState(""); - const [openedReallyChangingModal, setOpenedReallyChangingModal] = - useState(false); const theme = useTheme(); - const isMobile = useMediaQuery(theme.breakpoints.down(790)); - const isIconMobile = useMediaQuery(theme.breakpoints.down(1050)); const quiz = useCurrentQuiz(); + const isQuestionFirst = useQuestionsStore((state) => state.questions[0]?.id === questionId,); + + const isIconMobile = useMediaQuery(theme.breakpoints.down(1050)); + const isMobile = useMediaQuery(theme.breakpoints.down(790)); + const isIgnoreImage = !IgnoreImage.includes(questionType) + + const [buttonHover, setButtonHover] = useState(""); + const [openedReallyChangingModal, setOpenedReallyChangingModal] = useState(false); const [openDelete, setOpenDelete] = useState(false); - const isQuestionFirst = useQuestionsStore( - (state) => state.questions[0]?.id === questionId, - ); if (!quiz) return null; @@ -85,7 +89,7 @@ const ButtonsOptionsAndPict = memo(function ({ onMouseEnter={() => setButtonHover("setting")} onMouseLeave={() => setButtonHover("")} onClick={() => { - SSHC("setting"); + switchState === "setting" ? setSwitchState("") : setSwitchState("setting"); }} sx={{ maxWidth: "104px", @@ -153,38 +157,40 @@ const ButtonsOptionsAndPict = memo(function ({ {isIconMobile ? null : "Ветвление"} )} - setButtonHover("image")} - onMouseLeave={() => setButtonHover("")} - onClick={() => { - SSHC("image"); - }} - sx={{ - height: "30px", - maxWidth: "123px", - minWidth: isIconMobile ? "30px" : "64px", - backgroundColor: - switchState === "image" - ? theme.palette.brightPurple.main - : "transparent", - color: - switchState === "image" ? "#ffffff" : theme.palette.grey3.main, - "&:hover": { - color: switchState === "image" ? theme.palette.grey3.main : null, - }, - }} - > - - {isIconMobile ? null : "Изображение"} - + {isIgnoreImage && + setButtonHover("image")} + onMouseLeave={() => setButtonHover("")} + onClick={() => { + switchState === "image" ? setSwitchState("") : setSwitchState("image"); + }} + sx={{ + height: "30px", + maxWidth: "123px", + minWidth: isIconMobile ? "30px" : "64px", + backgroundColor: + switchState === "image" + ? theme.palette.brightPurple.main + : "transparent", + color: + switchState === "image" ? "#ffffff" : theme.palette.grey3.main, + "&:hover": { + color: switchState === "image" ? theme.palette.grey3.main : null, + }, + }} + > + + {isIconMobile ? null : "Изображение"} + + } (function ({ )} - setOpenDelete(false)}> - - - Вы удаляете вопрос, участвующий в ветвлении. Все его потомки - потеряют данные ветвления. Вы уверены, что хотите удалить вопрос? - - - - - - - + setOpenDelete(false)} + questionId={questionId} + /> setOpenedReallyChangingModal(false)} @@ -271,6 +237,4 @@ const ButtonsOptionsAndPict = memo(function ({ ); }); -ButtonsOptionsAndPict.displayName = "ButtonsOptionsAndPict"; - -export default ButtonsOptionsAndPict; +export default ButtonsOptions; diff --git a/src/pages/Questions/QuestionOptions/ButtonsLayout/DeleteBranchingQuestionModal.tsx b/src/pages/Questions/QuestionOptions/ButtonsLayout/DeleteBranchingQuestionModal.tsx new file mode 100644 index 00000000..469eb5ba --- /dev/null +++ b/src/pages/Questions/QuestionOptions/ButtonsLayout/DeleteBranchingQuestionModal.tsx @@ -0,0 +1,66 @@ +import { deleteQuestionWithTimeout } from "@/stores/questions/actions"; +import { DeleteFunction } from "@/utils/deleteFunc"; +import { Box, Button, Modal, Typography } from "@mui/material"; + +interface Props { + open: boolean; + onclose: () => void; + questionId: string; +} + +export const DeleteBranchingQuestionModal = ({ + open, + onclose, + questionId, +}: Props) => { + return ( + + + + Вы удаляете вопрос, участвующий в ветвлении. Все его потомки потеряют данные ветвления. Вы уверены, что хотите удалить вопрос? + + + + + + + + ) +} \ No newline at end of file diff --git a/src/pages/Questions/ButtonsOptions.tsx b/src/pages/Questions/QuestionOptions/ButtonsLayout/lalala.tsx similarity index 68% rename from src/pages/Questions/ButtonsOptions.tsx rename to src/pages/Questions/QuestionOptions/ButtonsLayout/lalala.tsx index 785b0a9c..8015eebe 100644 --- a/src/pages/Questions/ButtonsOptions.tsx +++ b/src/pages/Questions/QuestionOptions/ButtonsLayout/lalala.tsx @@ -8,15 +8,16 @@ import { updateDesireToOpenABranchingModal } from "@root/uiTools/actions"; import MiniButtonSetting from "@ui_kit/MiniButtonSetting"; import { DeleteFunction } from "@utils/deleteFunc"; import { memo, useState } from "react"; -import { CopyIcon } from "../../assets/icons/questionsPage/CopyIcon"; -import Branching from "../../assets/icons/questionsPage/branching"; -import SettingIcon from "../../assets/icons/questionsPage/settingIcon"; +import { CopyIcon } from "../../../../assets/icons/questionsPage/CopyIcon"; +import Branching from "../../../../assets/icons/questionsPage/branching"; +import SettingIcon from "../../../../assets/icons/questionsPage/settingIcon"; import { QuestionType } from "@model/question/question"; import type { AnyTypedQuizQuestion } from "@frontend/squzanswerer"; +import { DeleteBranchingQuestionModal } from "./DeleteBranchingQuestionModal"; interface Props { switchState: string; - SSHC: (data: string) => void; + setSwitchState: (data: string) => void; questionId: string; questionContentId: string; questionType: QuestionType; @@ -25,8 +26,8 @@ interface Props { sx?: SxProps; } -const ButtonsOptions = memo(function ({ - SSHC, +const lalalalala = memo(function ({ + setSwitchState, switchState, questionId, questionContentId, @@ -54,21 +55,21 @@ const ButtonsOptions = memo(function ({ value: string; myFunc?: any; }[] = [ - { - icon: , - title: "Настройки", - value: "setting", - }, - { - icon: , - title: "Ветвление", - value: "branching", - myFunc: (question: AnyTypedQuizQuestion) => { - setOpenBranchingPage(true); - updateDesireToOpenABranchingModal(question.content.id); + { + icon: , + title: "Настройки", + value: "setting", }, - }, - ]; + { + icon: , + title: "Ветвление", + value: "branching", + myFunc: (question: AnyTypedQuizQuestion) => { + setOpenBranchingPage(true); + updateDesireToOpenABranchingModal(question.content.id); + }, + }, + ]; return ( (function ({ height: isMobile ? "92px" : "70px", }} > + ButtonsOptions (function ({ { - SSHC(value); + setSwitchState(value); myFunc(); }} sx={{ @@ -170,55 +172,11 @@ const ButtonsOptions = memo(function ({ )} - setOpenDelete(false)} - > - - - Вы удаляете вопрос, участвующий в ветвлении. Все его потомки потеряют данные ветвления. Вы уверены, что - хотите удалить вопрос? - - - - - - - + onclose={() => setOpenDelete(false)} + questionId={questionId} + /> ); diff --git a/src/pages/Questions/DataOptions/DataOptions.tsx b/src/pages/Questions/QuestionOptions/DateOptions/DateOptions.tsx similarity index 88% rename from src/pages/Questions/DataOptions/DataOptions.tsx rename to src/pages/Questions/QuestionOptions/DateOptions/DateOptions.tsx index 3bd586ff..e1de3f99 100644 --- a/src/pages/Questions/DataOptions/DataOptions.tsx +++ b/src/pages/Questions/QuestionOptions/DateOptions/DateOptions.tsx @@ -1,8 +1,8 @@ import { Box, Tooltip, Typography, useMediaQuery, useTheme } from "@mui/material"; import { useState } from "react"; -import InfoIcon from "../../../assets/icons/InfoIcon"; -import ButtonsOptions from "../ButtonsOptions"; -import SwitchData from "./switchData"; +import InfoIcon from "@/assets/icons/InfoIcon"; +import ButtonsOptions from "../ButtonsLayout/ButtonsOptions"; +import SwitchDate from "./switchDate"; import TooltipClickInfo from "@ui_kit/Toolbars/TooltipClickInfo"; import { QuizQuestionDate } from "@frontend/squzanswerer"; @@ -12,7 +12,7 @@ interface Props { setOpenBranchingPage: (a: boolean) => void; } -export default function DataOptions({ question, openBranchingPage, setOpenBranchingPage }: Props) { +export default function DateOptions({ question, openBranchingPage, setOpenBranchingPage }: Props) { const [switchState, setSwitchState] = useState("setting"); const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down(790)); @@ -64,14 +64,14 @@ export default function DataOptions({ question, openBranchingPage, setOpenBranch - diff --git a/src/pages/Questions/DataOptions/settingData.tsx b/src/pages/Questions/QuestionOptions/DateOptions/settingDate.tsx similarity index 100% rename from src/pages/Questions/DataOptions/settingData.tsx rename to src/pages/Questions/QuestionOptions/DateOptions/settingDate.tsx diff --git a/src/pages/Questions/DataOptions/switchData.tsx b/src/pages/Questions/QuestionOptions/DateOptions/switchDate.tsx similarity index 86% rename from src/pages/Questions/DataOptions/switchData.tsx rename to src/pages/Questions/QuestionOptions/DateOptions/switchDate.tsx index 76eb1806..331305b1 100644 --- a/src/pages/Questions/DataOptions/switchData.tsx +++ b/src/pages/Questions/QuestionOptions/DateOptions/switchDate.tsx @@ -1,6 +1,6 @@ import { QuizQuestionDate } from "@frontend/squzanswerer"; -import HelpQuestions from "../helpQuestions"; -import SettingData from "./settingData"; +import HelpQuestions from "../../helpQuestions"; +import SettingDate from "./settingDate"; interface Props { switchState: string; @@ -11,7 +11,7 @@ export default function SwitchData({ switchState = "setting", question }: Props) switch (switchState) { case "setting": return ( - ( + variants={question.content.variants + .filter(variant => !variant.isOwn ? true : question.content.own && variant.isOwn) + .map((variant, index) => ( ))} /> @@ -152,9 +156,9 @@ export default function OptionsAndPicture({ question, setOpenBranchingPage }: Pr )} - (function ({ questionId, replText, isRequired, isOwn }) { +const SettingOptionsAndPict = memo(function ({ question, questionId, ownPlaceholder, isMulti, isLargeCheck, replText, isRequired, isOwn }) { const theme = useTheme(); + const {switchOwn} = useAddAnswer(); + const isWrappColumn = useMediaQuery(theme.breakpoints.down(980)); const isFigmaTablte = useMediaQuery(theme.breakpoints.down(990)); const isTablet = useMediaQuery(theme.breakpoints.down(985)); const isMobile = useMediaQuery(theme.breakpoints.down(680)); + const setReplText = (replText: string) => { updateQuestion(questionId, (question) => { @@ -49,7 +57,7 @@ const SettingOptionsAndPict = memo(function ({ quest width: "100%", }} > - {/* (function ({ quest }} > Настройки ответов - */} - {/* { - updateQuestion(questionId, (question) => { - question.content.own = target.checked; - }); - }} - /> */} + + { + switchOwn({question, checked:target.checked}) + }} + /> {!isWrappColumn && ( ); case "help": diff --git a/src/pages/Questions/OptionsPicture/OptionsPicture.tsx b/src/pages/Questions/QuestionOptions/OptionsPicture/OptionsPicture.tsx similarity index 85% rename from src/pages/Questions/OptionsPicture/OptionsPicture.tsx rename to src/pages/Questions/QuestionOptions/OptionsPicture/OptionsPicture.tsx index cef09aea..a4543324 100644 --- a/src/pages/Questions/OptionsPicture/OptionsPicture.tsx +++ b/src/pages/Questions/QuestionOptions/OptionsPicture/OptionsPicture.tsx @@ -3,14 +3,14 @@ import { clearQuestionImages, uploadQuestionImage } from "@root/questions/action import { useCurrentQuiz } from "@root/quizes/hooks"; import { CropModal, useCropModalState } from "@ui_kit/Modal/CropModal"; import { useState } from "react"; -import { EnterIcon } from "../../../assets/icons/questionsPage/enterIcon"; +import { EnterIcon } from "@/assets/icons/questionsPage/enterIcon"; import type { QuizQuestionImages } from "@frontend/squzanswerer"; -import { useAddAnswer } from "../../../utils/hooks/useAddAnswer"; -import { useDisclosure } from "../../../utils/useDisclosure"; -import { AnswerDraggableList } from "../AnswerDraggableList"; -import ImageEditAnswerItem from "../AnswerDraggableList/ImageEditAnswerItem"; -import ButtonsOptions from "../ButtonsOptions"; -import { UploadImageModal } from "../UploadImage/UploadImageModal"; +import { useAddAnswer } from "@/utils/hooks/useAddAnswer"; +import { useDisclosure } from "@/utils/useDisclosure"; +import { AnswerDraggableList } from "../../AnswerDraggableList"; +import ImageEditAnswerItem from "../../AnswerDraggableList/ImageEditAnswerItem"; +import ButtonsOptions from "../ButtonsLayout/ButtonsOptions"; +import { UploadImageModal } from "../../UploadImage/UploadImageModal"; import SwitchAnswerOptionsPict from "./switchOptionsPict"; interface Props { @@ -28,8 +28,7 @@ export default function OptionsPicture({ question, openBranchingPage, setOpenBra const [switchState, setSwitchState] = useState("setting"); const isMobile = useMediaQuery(theme.breakpoints.down(790)); const [isImageUploadOpen, openImageUploadModal, closeImageUploadModal] = useDisclosure(); - const { isCropModalOpen, openCropModal, closeCropModal, imageBlob, originalImageUrl, setCropModalImageBlob } = - useCropModalState(); + const { isCropModalOpen, openCropModal, closeCropModal, imageBlob, originalImageUrl, setCropModalImageBlob } = useCropModalState(); const handleImageUpload = async (file: File) => { if (!selectedVariantId) return; @@ -70,7 +69,9 @@ export default function OptionsPicture({ question, openBranchingPage, setOpenBra ( + variants={question.content.variants + .filter(variant => !variant.isOwn ? true : question.content.own && variant.isOwn) + .map((variant, index) => ( ))} /> @@ -137,7 +140,7 @@ export default function OptionsPicture({ question, openBranchingPage, setOpenBra (function ({ +const SettingOptionsPict = memo(function ({ + question, questionId, isRequired, - isMulti, + ownPlaceholder, isMulti, isLargeCheck, isOwn, proportions, format, @@ -55,6 +61,15 @@ const SettingOptionsPict = memo(function ({ const isTablet = useMediaQuery(theme.breakpoints.down(985)); const isMobile = useMediaQuery(theme.breakpoints.down(790)); const isFigmaTablte = useMediaQuery(theme.breakpoints.down(990)); + + const setOwnPlaceholder = (replText: string) => { + updateQuestion(questionId, (question) => { + if (question.type !== "varimg") return; + + question.content.ownPlaceholder = replText; + }); + }; + const {switchOwn} = useAddAnswer(); return ( (function ({ pt: isTablet ? "5px" : "0px", }} > - {/* - + {/* (function ({ /> ))} - + */} (function ({ > Настройки ответов + {/* { + updateQuestion(questionId, (question) => { + question.content.largeCheck = target.checked; + }); + }} + /> */} (function ({ label={'Вариант "свой ответ"'} checked={isOwn} handleChange={({ target }) => { - updateQuestion(questionId, (question) => { - question.content.own = target.checked; - }); + switchOwn({question, checked:target.checked}) }} /> + {/* + + Подсказка "своего ответа" + + setOwnPlaceholder(target.value)} + /> + */} - */} + {/* ); case "help": diff --git a/src/pages/Questions/PageOptions/PageOptions.tsx b/src/pages/Questions/QuestionOptions/PageOptions/PageOptions.tsx similarity index 100% rename from src/pages/Questions/PageOptions/PageOptions.tsx rename to src/pages/Questions/QuestionOptions/PageOptions/PageOptions.tsx diff --git a/src/pages/Questions/PageOptions/SettingPageOptions.tsx b/src/pages/Questions/QuestionOptions/PageOptions/SettingPageOptions.tsx similarity index 100% rename from src/pages/Questions/PageOptions/SettingPageOptions.tsx rename to src/pages/Questions/QuestionOptions/PageOptions/SettingPageOptions.tsx diff --git a/src/pages/Questions/PageOptions/switchPageOptions.tsx b/src/pages/Questions/QuestionOptions/PageOptions/switchPageOptions.tsx similarity index 100% rename from src/pages/Questions/PageOptions/switchPageOptions.tsx rename to src/pages/Questions/QuestionOptions/PageOptions/switchPageOptions.tsx diff --git a/src/pages/Questions/RatingOptions/RatingOptions.tsx b/src/pages/Questions/QuestionOptions/RatingOptions/RatingOptions.tsx similarity index 94% rename from src/pages/Questions/RatingOptions/RatingOptions.tsx rename to src/pages/Questions/QuestionOptions/RatingOptions/RatingOptions.tsx index fd6e9918..e86dd806 100644 --- a/src/pages/Questions/RatingOptions/RatingOptions.tsx +++ b/src/pages/Questions/QuestionOptions/RatingOptions/RatingOptions.tsx @@ -1,15 +1,15 @@ import { Box, TextField as MuiTextField, TextFieldProps, Typography, useMediaQuery, useTheme } from "@mui/material"; import { updateQuestion } from "@root/questions/actions"; import { FC, useLayoutEffect, useRef, useState } from "react"; -import FlagIcon from "../../../assets/icons/questionsPage/FlagIcon"; -import StarIconMini from "../../../assets/icons/questionsPage/StarIconMini"; -import HashtagIcon from "../../../assets/icons/questionsPage/hashtagIcon"; -import HeartIcon from "../../../assets/icons/questionsPage/heartIcon"; -import LightbulbIcon from "../../../assets/icons/questionsPage/lightbulbIcon"; -import LikeIcon from "../../../assets/icons/questionsPage/likeIcon"; -import TropfyIcon from "../../../assets/icons/questionsPage/tropfyIcon"; +import FlagIcon from "@/assets/icons/questionsPage/FlagIcon"; +import StarIconMini from "@/assets/icons/questionsPage/StarIconMini"; +import HashtagIcon from "@/assets/icons/questionsPage/hashtagIcon"; +import HeartIcon from "@/assets/icons/questionsPage/heartIcon"; +import LightbulbIcon from "@/assets/icons/questionsPage/lightbulbIcon"; +import LikeIcon from "@/assets/icons/questionsPage/likeIcon"; +import TropfyIcon from "@/assets/icons/questionsPage/tropfyIcon"; import type { QuizQuestionRating } from "@frontend/squzanswerer"; -import ButtonsOptions from "../ButtonsOptions"; +import ButtonsOptions from "../ButtonsLayout/ButtonsOptions"; import SwitchRating from "./switchRating"; const TextField = MuiTextField as unknown as FC; @@ -289,7 +289,7 @@ export default function RatingOptions({ question, openBranchingPage, setOpenBran ( + variants={question.content.variants + .filter(variant => !variant.isOwn ? true : question.content.own && variant.isOwn) + .map((variant, index) => ( = 100} questionId={question.id} variant={variant} + isOwn={Boolean(variant.isOwn)} + ownPlaceholder={question.content.ownPlaceholder} /> ))} /> @@ -100,9 +104,9 @@ export default function AnswerOptions({ question, openBranchingPage, setOpenBran )} - (function ({ questionId, isRequired, isLargeCheck, isMulti, isOwn }) { +const ResponseSettings = memo(function ({question, questionId, ownPlaceholder, isRequired, isLargeCheck, isMulti, isOwn }) { const theme = useTheme(); const isTablet = useMediaQuery(theme.breakpoints.down(900)); const isFigmaTablte = useMediaQuery(theme.breakpoints.down(990)); const isMobile = useMediaQuery(theme.breakpoints.down(790)); + const {switchOwn} = useAddAnswer(); return ( (function ({ questionId, isRequired, isLarge pt: isTablet ? "5px" : "0px", }} > - {/* (function ({ questionId, isRequired, isLarge { updateQuestion(questionId, (question) => { @@ -79,12 +84,10 @@ const ResponseSettings = memo(function ({ questionId, isRequired, isLarge label={'Вариант "свой ответ"'} checked={isOwn} handleChange={({ target }) => { - updateQuestion(questionId, (question) => { - question.content.own = target.checked; - }); + switchOwn({question, checked:target.checked}) }} /> - */} + ); case "help": diff --git a/src/pages/Questions/QuestionsPage.tsx b/src/pages/Questions/QuestionsPage.tsx index fc0c2c81..40c48a16 100755 --- a/src/pages/Questions/QuestionsPage.tsx +++ b/src/pages/Questions/QuestionsPage.tsx @@ -22,8 +22,8 @@ import { useLayoutEffect } from "react"; import { createPortal } from "react-dom"; import AddPlus from "../../assets/icons/questionsPage/addPlus"; import ArrowLeft from "../../assets/icons/questionsPage/arrowLeft"; -import BranchingQuestions from "./BranchingModal/BranchingQuestionsModal"; -import { QuestionSwitchWindowTool } from "./QuestionSwitchWindowTool"; +import BranchingQuestions from "./Branching/BranchingModal/BranchingQuestionsModal"; +import { QuestionSwitchWindowTool } from "./Branching/QuestionSwitchWindowTool"; interface Props { openBranchingPage: boolean; diff --git a/src/pages/Questions/SwitchQuestionsPage.tsx b/src/pages/Questions/SwitchQuestionsPage.tsx index 602f73c1..bab1a9db 100644 --- a/src/pages/Questions/SwitchQuestionsPage.tsx +++ b/src/pages/Questions/SwitchQuestionsPage.tsx @@ -1,14 +1,14 @@ -import DataOptions from "./DataOptions/DataOptions"; +import DateOptions from "./QuestionOptions/DateOptions/DateOptions"; import DropDown from "./DropDown/DropDown"; import Emoji from "./Emoji/Emoji"; -import OptionsAndPicture from "./OptionsAndPicture/OptionsAndPicture"; -import OptionsPicture from "./OptionsPicture/OptionsPicture"; +import OptionsAndPicture from "./QuestionOptions/OptionsAndPicture/OptionsAndPicture"; +import OptionsPicture from "./QuestionOptions/OptionsPicture/OptionsPicture"; import OwnTextField from "./OwnTextField/OwnTextField"; -import PageOptions from "./PageOptions/PageOptions"; -import RatingOptions from "./RatingOptions/RatingOptions"; -import SliderOptions from "./SliderOptions/SliderOptions"; +import PageOptions from "./QuestionOptions/PageOptions/PageOptions"; +import RatingOptions from "./QuestionOptions/RatingOptions/RatingOptions"; +import SliderOptions from "./QuestionOptions/SliderOptions/SliderOptions"; import UploadFile from "./UploadFile/UploadFile"; -import AnswerOptions from "./answerOptions/AnswerOptions"; +import AnswerOptions from "./QuestionOptions/answerOptions/AnswerOptions"; import { notReachable } from "../../utils/notReachable"; import { AnyTypedQuizQuestion } from "@frontend/squzanswerer"; @@ -76,7 +76,7 @@ export default function SwitchQuestionsPage({ question, openBranchingPage, setOp case "date": return ( - void; + setSwitchState: (data: string) => void; } -export default function ButtonsOptionsForm({ SSHC, switchState }: Props) { +export default function ButtonsOptionsForm({ setSwitchState, switchState }: Props) { const theme = useTheme(); const isTablet = useMediaQuery(theme.breakpoints.down(800)); @@ -74,7 +74,7 @@ export default function ButtonsOptionsForm({ SSHC, switchState }: Props) { { - SSHC(value); + setSwitchState(value); }} sx={{ backgroundColor: diff --git a/src/pages/ResultPage/DescriptionForm/DescriptionForm.tsx b/src/pages/ResultPage/DescriptionForm/DescriptionForm.tsx index 2038969f..e4c452b1 100644 --- a/src/pages/ResultPage/DescriptionForm/DescriptionForm.tsx +++ b/src/pages/ResultPage/DescriptionForm/DescriptionForm.tsx @@ -24,7 +24,7 @@ export const DescriptionForm = () => { setPriceButtonsType(type); }; - const SSHC = (data: string) => { + const setSwitchState = (data: string) => { setSwitchState(data); }; @@ -188,7 +188,7 @@ export const DescriptionForm = () => { )} - + ); diff --git a/src/pages/Tariffs/ModalRequestCreate.tsx b/src/pages/Tariffs/ModalRequestCreate.tsx index 5d0a0e79..ab33e7a7 100644 --- a/src/pages/Tariffs/ModalRequestCreate.tsx +++ b/src/pages/Tariffs/ModalRequestCreate.tsx @@ -219,7 +219,6 @@ export const ModalRequestCreate = ({ time: moment(values.time).format("hh:mm") }) }) - console.log(resp) if (resp[0]?.status === 200) { enqueueSnackbar("Запрос успешно отправлен") setIsSending(true) diff --git a/src/stores/questions/actions.ts b/src/stores/questions/actions.ts index 023a8ac5..fdf78b43 100644 --- a/src/stores/questions/actions.ts +++ b/src/stores/questions/actions.ts @@ -4,7 +4,7 @@ import { devlog } from "@frontend/kitui"; import { AnyTypedQuizQuestion, QuestionVariant } from "@frontend/squzanswerer"; import { questionToEditQuestionRequest } from "@model/question/edit"; import { QuestionType, RawQuestion, rawQuestionToQuestion } from "@model/question/question"; -import { UntypedQuizQuestion, createQuestionVariant } from "@model/questionTypes/shared"; +import { UntypedQuizQuestion, createQuestionOwnVariant, createQuestionVariant } from "@model/questionTypes/shared"; import { produce } from "immer"; import { nanoid } from "nanoid"; import { enqueueSnackbar } from "notistack"; @@ -29,7 +29,6 @@ export const setQuestions = (questions: RawQuestion[] | null | undefined) => export const createUntypedQuestion = (quizId: number, insertAfterQuestionId?: string) => { const { questions } = useQuestionsStore.getState(); - console.log("insertAfterQuestionId ", insertAfterQuestionId) const questionsAmount = questions.filter(({ type }) => type !== "result").length; @@ -68,7 +67,6 @@ export const createUntypedQuestion = (quizId: number, insertAfterQuestionId?: st export const createUntypedQuestionForm = (quizId: number, insertAfterQuestionId?: string) => { const { questions } = useQuestionsStore.getState(); - console.log("insertAfterQuestionId ", insertAfterQuestionId) const questionsAmount = questions.filter(({ type }) => type !== "result").length; @@ -338,6 +336,20 @@ export const addQuestionVariant = (questionId: string) => { } }); }; +export const addQuestionOwnVariant = (questionId: string) => { + updateQuestion(questionId, (question) => { + switch (question.type) { + case "variant": + case "emoji": + case "images": + case "varimg": + question.content.variants.push(createQuestionOwnVariant()); + break; + default: + throw new Error(`Cannot add variant to question of type "${question.type}"`); + } + }); +}; export const deleteQuestionVariant = (questionId: string, variantId: string) => { updateQuestion(questionId, (question) => { diff --git a/src/utils/hooks/useAddAnswer.ts b/src/utils/hooks/useAddAnswer.ts index fe9b2760..0c8ee048 100644 --- a/src/utils/hooks/useAddAnswer.ts +++ b/src/utils/hooks/useAddAnswer.ts @@ -1,10 +1,26 @@ import { QuizQuestionsWithVariants } from "@frontend/squzanswerer"; -import { addQuestionVariant } from "@root/questions/actions"; +import { addQuestionOwnVariant, addQuestionVariant, updateQuestion } from "@root/questions/actions"; export const useAddAnswer = () => { const onClickAddAnAnswer = (question: QuizQuestionsWithVariants) => { addQuestionVariant(question.id); }; + interface SwitchOwnProps { + question: QuizQuestionsWithVariants; + checked: boolean + } + const switchOwn = ({ question, checked }: SwitchOwnProps) => { + if (!question.content.variants.some(v => v.isOwn) && checked) { + addQuestionOwnVariant(question.id) + } - return onClickAddAnAnswer; + updateQuestion(question.id, (question) => { + question.content.own = checked; + }); + } + + return { + onClickAddAnAnswer, + switchOwn + }; }; diff --git a/src/utils/hooks/useAutoPay.ts b/src/utils/hooks/useAutoPay.ts index e4274de3..d0591061 100644 --- a/src/utils/hooks/useAutoPay.ts +++ b/src/utils/hooks/useAutoPay.ts @@ -32,11 +32,9 @@ export const useAfterPay = () => { const [, payCartError] = await cartApi.pay(); if (payCartError) { - console.log("попытка оплаты не удалась") //Не получилось купить корзину. Ставим флаг, что сайт в состоянии ожидания пополнения счёта для оплаты startPayCartProcess(paymentUserId) } else { - enqueueSnackbar("Товары успешно приобретены") if (currentCC) navigate("/tariffs") cancelPayCartProcess() } @@ -52,7 +50,6 @@ export const useAfterPay = () => { //Время ещё не вышло. У нас стоит флаг покупать корзину если время не вышло. (async () => { - console.log("Время ещё не вышло. У нас стоит флаг покупать корзину если время не вышло.") const [, payCartError] = await cartApi.pay(); if (!payCartError) {