ваиранты получили работающие новые фичи

This commit is contained in:
Nastya 2024-09-11 09:11:48 +03:00
parent 19b80694cb
commit 22f8e80d16
22 changed files with 131 additions and 135 deletions

@ -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: "",
};
}

@ -9,8 +9,6 @@ type AnswerItemProps = {
};
export const AnswerItem: FC<AnswerItemProps> = ({ fieldName, fieldValue, deleteHC }) => {
console.log("AnswerItem")
console.log(fieldName)
const theme = useTheme();
return (
<Box

@ -32,7 +32,6 @@ export const SettingItem: FC<SettingItemProps> = ({
selectedTags,
}) => {
const theme = useTheme();
console.log(step)
const isMobile = useMediaQuery(theme.breakpoints.down(600));
if (step === 0) {
return;

@ -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<TextFieldProps>;
@ -26,10 +26,11 @@ type AnswerItemProps = {
disableKeyDown?: boolean;
additionalContent?: ReactNode;
additionalMobile?: ReactNode;
isOwn: boolean;
};
const AnswerItem = memo<AnswerItemProps>(
({ index, variant, questionId, largeCheck = false, additionalContent, additionalMobile, disableKeyDown }) => {
({ index, variant, questionId, largeCheck = false, additionalContent, additionalMobile, disableKeyDown, isOwn }) => {
const theme = useTheme();
const isTablet = useMediaQuery(theme.breakpoints.down(790));
@ -58,7 +59,7 @@ const AnswerItem = memo<AnswerItemProps>(
value={variant.answer}
fullWidth
focused={false}
placeholder={"Добавьте ответ"}
placeholder={isOwn ? "Добавьте текст-подсказку для ввода “своего ответа”" : "Добавьте ответ"}
multiline={largeCheck}
onChange={({ target }: ChangeEvent<HTMLInputElement>) => {
if (target.value.length <= 1000) {
@ -67,7 +68,7 @@ const AnswerItem = memo<AnswerItemProps>(
}}
onKeyDown={(event: KeyboardEvent<HTMLInputElement>) => {
if (disableKeyDown) {
enqueueSnackbar("100 максимальное количество вопросов");
enqueueSnackbar("100 максимальное количество");
} else if (event.code === "Enter" && !largeCheck) {
addQuestionVariant(questionId);
}
@ -88,7 +89,13 @@ const AnswerItem = memo<AnswerItemProps>(
<InputAdornment position="end">
<IconButton
sx={{ padding: "0" }}
onClick={() => deleteQuestionVariant(questionId, variant.id)}
onClick={() => {
isOwn ? updateQuestion<QuizQuestionVariant>(questionId, (question) => {
question.content.own = false;
})
:
deleteQuestionVariant(questionId, variant.id)
}}
>
<DeleteIcon
style={{
@ -104,7 +111,7 @@ const AnswerItem = memo<AnswerItemProps>(
"& .MuiInputBase-root": {
padding: additionalContent ? "5px 13px" : "13px",
borderRadius: "10px",
background: "#ffffff",
background: isOwn ? "#F2F3F7" : "white",
"& input.MuiInputBase-input": {
height: "22px",
},

@ -14,6 +14,7 @@ type Props = Omit<
originalImageUrl?: string | null | undefined,
) => Promise<void>;
openImageUploadModal: () => void;
isOwn: boolean;
};
export default function ImageEditAnswerItem({
@ -27,6 +28,7 @@ export default function ImageEditAnswerItem({
pictureUploding,
openCropModal,
openImageUploadModal,
isOwn,
}: Props) {
const addOrEditImageButton = useMemo(() => {
return (
@ -105,6 +107,7 @@ export default function ImageEditAnswerItem({
variant={variant}
additionalContent={addOrEditImageButton}
additionalMobile={addOrEditImageButtonMobile}
isOwn={isOwn}
/>
);
}

@ -18,7 +18,7 @@ interface Props {
export default function Emoji({ question, openBranchingPage, setOpenBranchingPage }: Props) {
const [switchState, setSwitchState] = useState<string>("setting");
const onClickAddAnAnswer = useAddAnswer();
const {onClickAddAnAnswer} = useAddAnswer();
const [open, setOpen] = useState<boolean>(false);
const [anchorElement, setAnchorElement] = useState<HTMLDivElement | null>(null);
const [selectedVariant, setSelectedVariant] = useState<string | null>(null);
@ -29,9 +29,12 @@ export default function Emoji({ question, openBranchingPage, setOpenBranchingPag
return (
<>
<Box sx={{ padding: "20px" }}>
<AnswerDraggableList
questionId={question.id}
variants={question.content.variants.map((variant, index) => (
variants={question.content.variants
.filter(variant => !variant.isOwn ? true : question.content.own && variant.isOwn)
.map((variant, index) => (
<EmojiAnswerItem
key={variant.id}
index={index}
@ -42,9 +45,11 @@ export default function Emoji({ question, openBranchingPage, setOpenBranchingPag
setAnchorElement={setAnchorElement}
setOpen={setOpen}
setSelectedVariant={setSelectedVariant}
isOwn={Boolean(variant?.isOwn)}
/>
))}
/>
<Popover
open={open}
anchorEl={anchorElement}

@ -2,6 +2,7 @@ import { ComponentPropsWithoutRef, useMemo } from "react";
import AnswerItem from "../../AnswerDraggableList/AnswerItem";
import VariantAdornment from "./VariantAdornment";
import VariantAdornmentMobile from "./VariantAdornmentMobile";
import { updateQuestion } from "@/stores/questions/actions";
type Props = Omit<
ComponentPropsWithoutRef<typeof AnswerItem>,
@ -11,6 +12,7 @@ type Props = Omit<
setAnchorElement: React.Dispatch<React.SetStateAction<HTMLDivElement | null>>;
setSelectedVariant: React.Dispatch<React.SetStateAction<string | null>>;
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
isOwn: boolean;
};
export default function EmojiAnswerItem({
@ -23,7 +25,17 @@ export default function EmojiAnswerItem({
setAnchorElement,
setSelectedVariant,
setOpen,
isOwn
}: Props) {
const setOwnPlaceholder = (replText: string) => {
updateQuestion(questionId, (question) => {
if (question.type !== "varimg") return;
question.content.ownPlaceholder = replText;
});
};
const addOrEditImageButton = useMemo(() => {
return (
!isTablet && (
@ -77,6 +89,8 @@ export default function EmojiAnswerItem({
variant={variant}
additionalContent={addOrEditImageButton}
additionalMobile={addOrEditImageButtonMobile}
isOwn={isOwn}
changeOwnText={setOwnPlaceholder}
/>
);
}

@ -1,11 +1,13 @@
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;
@ -13,8 +15,10 @@ type SettingEmojiProps = {
isLargeCheck?: boolean;
};
const SettingEmoji = memo<SettingEmojiProps>(function ({ questionId, ownPlaceholder, isRequired, isLargeCheck, isMulti, isOwn }) {
const SettingEmoji = memo<SettingEmojiProps>(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));
@ -60,7 +64,7 @@ const SettingEmoji = memo<SettingEmojiProps>(function ({ questionId, ownPlacehol
>
Настройки ответов
</Typography>
<CustomCheckbox
{/* <CustomCheckbox
dataCy="checkbox-long-text-answer"
sx={{ mr: isMobile ? "0px" : "16px" }}
label={"Многострочный ответ"}
@ -70,7 +74,7 @@ const SettingEmoji = memo<SettingEmojiProps>(function ({ questionId, ownPlacehol
question.content.largeCheck = target.checked;
});
}}
/>
/> */}
<CustomCheckbox
dataCy="checkbox-multiple-answers"
sx={{ mr: isMobile ? "0px" : "16px" }}
@ -88,12 +92,10 @@ const SettingEmoji = memo<SettingEmojiProps>(function ({ questionId, ownPlacehol
label={'Вариант "свой ответ"'}
checked={isOwn}
handleChange={({ target }) => {
updateQuestion<QuizQuestionVariant>(questionId, (question) => {
question.content.own = target.checked;
});
switchOwn({question, checked:target.checked})
}}
/>
<Box sx={{ mt: isMobile ? "11px" : "6px", width: "100%" }}>
{/* <Box sx={{ mt: isMobile ? "11px" : "6px", width: "100%" }}>
<Typography
sx={{
height: isMobile ? "18px" : "auto",
@ -116,7 +118,7 @@ const SettingEmoji = memo<SettingEmojiProps>(function ({ questionId, ownPlacehol
value={ownPlaceholder}
onChange={({ target }) => setOwnPlaceholder(target.value)}
/>
</Box>
</Box> */}
</Box>
<Box
sx={{

@ -12,6 +12,7 @@ export default function SwitchEmoji({ switchState = "setting", question }: Props
case "setting":
return (
<SettingEmoji
question={question}
questionId={question.id}
isRequired={question.content.required}
isOwn={question.content.own}

@ -73,7 +73,9 @@ export default function OptionsAndPicture({ question, setOpenBranchingPage }: Pr
<Box sx={{ pl: "20px", pr: "20px" }}>
<AnswerDraggableList
questionId={question.id}
variants={question.content.variants.map((variant, index) => (
variants={question.content.variants
.filter(variant => !variant.isOwn ? true : question.content.own && variant.isOwn)
.map((variant, index) => (
<ImageEditAnswerItem
key={variant.id}
index={index}
@ -86,6 +88,7 @@ export default function OptionsAndPicture({ question, setOpenBranchingPage }: Pr
openImageUploadModal={openImageUploadModal}
pictureUploding={pictureUploding}
setSelectedVariantId={setSelectedVariantId}
isOwn={Boolean(variant?.isOwn)}
/>
))}
/>

@ -1,3 +1,4 @@
import { useAddAnswer } from "@/utils/hooks/useAddAnswer";
import type { QuizQuestionVarImg, QuizQuestionVariant } from "@frontend/squzanswerer";
import { Box, Typography, useMediaQuery, useTheme } from "@mui/material";
import { updateQuestion } from "@root/questions/actions";
@ -13,14 +14,18 @@ type SettingOptionsAndPictProps = {
isOwn: boolean;
ownPlaceholder?: boolean;
isMulti?: boolean;
question: QuizQuestionVarImg;
};
const SettingOptionsAndPict = memo<SettingOptionsAndPictProps>(function ({ questionId, ownPlaceholder, isMulti, isLargeCheck, replText, isRequired, isOwn }) {
const SettingOptionsAndPict = memo<SettingOptionsAndPictProps>(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) => {
@ -29,13 +34,6 @@ const SettingOptionsAndPict = memo<SettingOptionsAndPictProps>(function ({ quest
question.content.replText = replText;
});
};
const setOwnPlaceholder = (replText: string) => {
updateQuestion(questionId, (question) => {
if (question.type !== "varimg") return;
question.content.ownPlaceholder = replText;
});
};
return (
<>
@ -69,63 +67,15 @@ const SettingOptionsAndPict = memo<SettingOptionsAndPictProps>(function ({ quest
>
Настройки ответов
</Typography>
<CustomCheckbox
dataCy="checkbox-long-text-answer"
sx={{ mr: isMobile ? "0px" : "16px" }}
label={"Многострочный ответ"}
checked={isLargeCheck}
handleChange={({ target }) => {
updateQuestion<QuizQuestionVariant>(questionId, (question) => {
question.content.largeCheck = target.checked;
});
}}
/>
<CustomCheckbox
dataCy="checkbox-multiple-answers"
sx={{ mr: isMobile ? "0px" : "16px" }}
label={"Можно несколько"}
checked={isMulti}
handleChange={({ target }) => {
updateQuestion<QuizQuestionVariant>(questionId, (question) => {
question.content.multi = target.checked;
});
}}
/>
<CustomCheckbox
dataCy="checkbox-own-answer"
sx={{ mr: isMobile ? "0px" : "16px" }}
label={'Вариант "свой ответ"'}
checked={isOwn}
handleChange={({ target }) => {
updateQuestion<QuizQuestionVariant>(questionId, (question) => {
question.content.own = target.checked;
});
switchOwn({question, checked:target.checked})
}}
/>
<Box sx={{ mt: isMobile ? "11px" : "6px", width: "100%" }}>
<Typography
sx={{
height: isMobile ? "18px" : "auto",
fontWeight: "500",
fontSize: "18px",
color: " #4D4D4D",
mb: "14px",
}}
>
Подсказка "своего ответа"
</Typography>
<CustomTextField
sx={{
maxWidth: "330px",
width: "100%",
mr: isMobile ? "0px" : "16px",
}}
maxLength={60}
placeholder={"мой ответ: три"}
value={ownPlaceholder}
onChange={({ target }) => setOwnPlaceholder(target.value)}
/>
</Box>
{!isWrappColumn && (
<Box sx={{ mt: isMobile ? "11px" : "6px", width: "100%" }}>
<Typography

@ -9,11 +9,11 @@ interface Props {
}
export default function SwitchOptionsAndPict({ switchState = "setting", question }: Props) {
console.log(question)
switch (switchState) {
case "setting":
return (
<SettingOptionsAndPict
question={question}
questionId={question.id}
replText={question.content.replText}
isRequired={question.content.required}

@ -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
<Box sx={{ padding: "20px" }}>
<AnswerDraggableList
questionId={question.id}
variants={question.content.variants.map((variant, index) => (
variants={question.content.variants
.filter(variant => !variant.isOwn ? true : question.content.own && variant.isOwn)
.map((variant, index) => (
<ImageEditAnswerItem
key={variant.id}
index={index}
@ -83,6 +84,7 @@ export default function OptionsPicture({ question, openBranchingPage, setOpenBra
openImageUploadModal={openImageUploadModal}
pictureUploding={pictureUploding}
setSelectedVariantId={setSelectedVariantId}
isOwn={Boolean(variant?.isOwn)}
/>
))}
/>

@ -9,6 +9,7 @@ import ProportionsIcon11 from "@/assets/icons/questionsPage/ProportionsIcon11";
import ProportionsIcon12 from "@/assets/icons/questionsPage/ProportionsIcon12";
import ProportionsIcon21 from "@/assets/icons/questionsPage/ProportionsIcon21";
import CustomTextField from "@ui_kit/CustomTextField";
import { useAddAnswer } from "@/utils/hooks/useAddAnswer";
type Proportion = "1:1" | "1:2" | "2:1";
@ -36,6 +37,7 @@ const FORMATS: FormatItem[] = [
];
type SettingOptionsPictProps = {
question: QuizQuestionVariant;
questionId: string;
isRequired: boolean;
isMulti: boolean;
@ -47,6 +49,7 @@ type SettingOptionsPictProps = {
};
const SettingOptionsPict = memo<SettingOptionsPictProps>(function ({
question,
questionId,
isRequired,
ownPlaceholder, isMulti, isLargeCheck,
@ -66,6 +69,7 @@ const SettingOptionsPict = memo<SettingOptionsPictProps>(function ({
question.content.ownPlaceholder = replText;
});
};
const {switchOwn} = useAddAnswer();
return (
<Box
@ -143,7 +147,7 @@ const SettingOptionsPict = memo<SettingOptionsPictProps>(function ({
>
Настройки ответов
</Typography>
<CustomCheckbox
{/* <CustomCheckbox
dataCy="checkbox-long-text-answer"
sx={{ mr: isMobile ? "0px" : "16px" }}
label={"Многострочный ответ"}
@ -153,7 +157,7 @@ const SettingOptionsPict = memo<SettingOptionsPictProps>(function ({
question.content.largeCheck = target.checked;
});
}}
/>
/> */}
<CustomCheckbox
dataCy="checkbox-multiple-answers"
sx={{ mr: isMobile ? "0px" : "16px" }}
@ -171,12 +175,10 @@ const SettingOptionsPict = memo<SettingOptionsPictProps>(function ({
label={'Вариант "свой ответ"'}
checked={isOwn}
handleChange={({ target }) => {
updateQuestion<QuizQuestionVariant>(questionId, (question) => {
question.content.own = target.checked;
});
switchOwn({question, checked:target.checked})
}}
/>
<Box sx={{ mt: isMobile ? "11px" : "6px", width: "100%" }}>
{/* <Box sx={{ mt: isMobile ? "11px" : "6px", width: "100%" }}>
<Typography
sx={{
height: isMobile ? "18px" : "auto",
@ -199,7 +201,7 @@ const SettingOptionsPict = memo<SettingOptionsPictProps>(function ({
value={ownPlaceholder}
onChange={({ target }) => setOwnPlaceholder(target.value)}
/>
</Box>
</Box> */}
</Box>
</Box>
<Box sx={{ display: "flex", flexDirection: "column", width: "100%" }}>

@ -12,6 +12,7 @@ export default function SwitchAnswerOptionsPict({ switchState = "setting", quest
case "setting":
return (
<SettingOptionsPict
question={question}
questionId={question.id}
isRequired={question.content.required}
isMulti={question.content.multi}

@ -44,13 +44,16 @@ export default function AnswerOptions({ question, openBranchingPage, setOpenBran
) : (
<AnswerDraggableList
questionId={question.id}
variants={question.content.variants.map((variant, index) => (
variants={question.content.variants
.filter(variant => !variant.isOwn ? true : question.content.own && variant.isOwn)
.map((variant, index) => (
<AnswerItem
key={variant.id}
index={index}
disableKeyDown={question.content.variants.length >= 100}
questionId={question.id}
variant={variant}
isOwn={Boolean(variant.isOwn)}
/>
))}
/>

@ -4,8 +4,10 @@ import CustomCheckbox from "@ui_kit/CustomCheckbox";
import type { QuizQuestionVariant } from "@frontend/squzanswerer";
import { memo } from "react";
import CustomTextField from "@ui_kit/CustomTextField";
import { useAddAnswer } from "@/utils/hooks/useAddAnswer";
interface Props {
question: QuizQuestionVariant;
questionId: string;
isRequired: boolean;
isLargeCheck: boolean;
@ -14,18 +16,12 @@ interface Props {
ownPlaceholder?: string;
}
const ResponseSettings = memo<Props>(function ({ questionId, ownPlaceholder, isRequired, isLargeCheck, isMulti, isOwn }) {
const ResponseSettings = memo<Props>(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 setOwnPlaceholder = (replText: string) => {
updateQuestion(questionId, (question) => {
if (question.type !== "varimg") return;
question.content.ownPlaceholder = replText;
});
};
const {switchOwn} = useAddAnswer();
return (
<Box
@ -88,35 +84,9 @@ const ResponseSettings = memo<Props>(function ({ questionId, ownPlaceholder, isR
label={'Вариант "свой ответ"'}
checked={isOwn}
handleChange={({ target }) => {
updateQuestion<QuizQuestionVariant>(questionId, (question) => {
question.content.own = target.checked;
});
switchOwn({question, checked:target.checked})
}}
/>
<Box sx={{ mt: isMobile ? "11px" : "6px", width: "100%" }}>
<Typography
sx={{
height: isMobile ? "18px" : "auto",
fontWeight: "500",
fontSize: "18px",
color: " #4D4D4D",
mb: "14px",
}}
>
Подсказка "своего ответа"
</Typography>
<CustomTextField
sx={{
maxWidth: "330px",
width: "100%",
mr: isMobile ? "0px" : "16px",
}}
maxLength={60}
placeholder={"мой ответ: три"}
value={ownPlaceholder}
onChange={({ target }) => setOwnPlaceholder(target.value)}
/>
</Box>
</Box>
<Box
sx={{

@ -13,6 +13,7 @@ export default function SwitchAnswerOptions({ switchState = "setting", question
case "setting":
return (
<ResponseSettings
question={question}
questionId={question.id}
isRequired={question.content.required}
isLargeCheck={question.content.largeCheck}

@ -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)

@ -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) => {

@ -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<QuizQuestionVariant>(question.id, (question) => {
question.content.own = checked;
});
}
return {
onClickAddAnAnswer,
switchOwn
};
};

@ -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) {