Merge branch 'add-quiz-copy-functionality' into dev

This commit is contained in:
Nastya 2024-03-28 00:07:04 +03:00
commit 0831da8403
3 changed files with 51 additions and 7 deletions

@ -7,12 +7,16 @@ import {
useMediaQuery,
useTheme,
} from "@mui/material";
import { createQuiz, updateQuiz } from "@root/quizes/actions";
import {
copyQuiz,
createQuiz,
resetEditConfig,
updateQuiz,
} from "@root/quizes/actions";
import { useQuizes } from "@root/quizes/hooks";
import SectionWrapper from "@ui_kit/SectionWrapper";
import React from "react";
import { useNavigate } from "react-router-dom";
import { resetEditConfig } from "@root/quizes/actions";
import FirstQuiz from "./FirstQuiz";
import QuizCard from "./QuizCard";
import HeaderFull from "@ui_kit/Header/HeaderFull";
@ -32,6 +36,10 @@ export default function MyQuizzesFull({
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down(500));
const onClickCopy = (value: string) => {
copyQuiz(value);
};
return (
<>
<HeaderFull isRequest={false} />
@ -98,6 +106,7 @@ export default function MyQuizzesFull({
).toFixed(1)
: 0
}
onClickCopy={onClickCopy}
/>
);
})}

@ -1,5 +1,4 @@
import { useState, useRef, useLayoutEffect } from "react";
import ChartIcon from "@icons/ChartIcon";
import React, { useLayoutEffect, useRef, useState } from "react";
import LinkIcon from "@icons/LinkIcon";
import PencilIcon from "@icons/PencilIcon";
import { Quiz } from "@model/quiz/quiz";
@ -8,10 +7,10 @@ import {
Box,
Button,
IconButton,
Popover,
Typography,
useMediaQuery,
useTheme,
Popover,
} from "@mui/material";
import { deleteQuiz, setEditQuizId } from "@root/quizes/actions";
import { Link, useNavigate } from "react-router-dom";
@ -19,12 +18,14 @@ import { inCart } from "../../pages/Tariffs/Tariffs";
import { makeRequest } from "@frontend/kitui";
import { enqueueSnackbar } from "notistack";
import { useDomainDefine } from "@utils/hooks/useDomainDefine";
import CopyIcon from "@icons/CopyIcon";
interface Props {
quiz: Quiz;
openCount?: number;
applicationCount?: number;
conversionPercent?: number;
onClickCopy: (value: string) => void;
}
export default function QuizCard({
@ -32,6 +33,7 @@ export default function QuizCard({
openCount = 0,
applicationCount = 0,
conversionPercent = 0,
onClickCopy,
}: Props) {
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down(600));
@ -196,6 +198,15 @@ export default function QuizCard({
},
}}
/> */}
<IconButton
onClick={() => onClickCopy(quiz.id)}
sx={{ borderRadius: "6px", padding: "0 4px" }}
>
<CopyIcon
color={theme.palette.brightPurple.main}
bgcolor={"#EEE4FC"}
/>
</IconButton>
<IconButton
ref={subMenuRef}
sx={{

@ -2,7 +2,7 @@ import { quizApi } from "@api/quiz";
import { devlog, getMessageFromFetchError } from "@frontend/kitui";
import { quizToEditQuizRequest } from "@model/quiz/edit";
import { Quiz, RawQuiz, rawQuizToQuiz } from "@model/quiz/quiz";
import { QuizConfig, maxQuizSetupSteps } from "@model/quizSettings";
import { maxQuizSetupSteps, QuizConfig } from "@model/quizSettings";
import { createUntypedQuestion, updateQuestion } from "@root/questions/actions";
import { useQuestionsStore } from "@root/questions/store";
import { produce } from "immer";
@ -243,7 +243,31 @@ export const updateRootContentId = (quizId: string, id: string) => {
});
};
// TODO copy quiz
export const copyQuiz = async (quizId: string) =>
requestQueue.enqueue(`copyQuiz`, async () => {
const quiz = useQuizStore.getState().quizes.find((q) => q.id === quizId);
if (!quiz) return;
try {
const { updated } = await quizApi.copy(quiz.backendId);
let newQuiz = { ...quiz, id: updated };
setProducedState(
(state) => {
state.quizes.unshift(quiz);
},
{
type: "addQuiz",
quiz,
},
);
} catch (error) {
devlog("Error copying quiz", error);
const message = getMessageFromFetchError(error) ?? "";
enqueueSnackbar(`Не удалось скопировать quiz. ${message}`);
}
});
export const uploadQuizImage = async (
quizId: string,