ваиранты получили работающие новые фичи
This commit is contained in:
parent
19b80694cb
commit
22f8e80d16
@ -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) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user