diff --git a/src/pages/createQuize/MyQuizzesFull.tsx b/src/pages/createQuize/MyQuizzesFull.tsx
index 0932ea27..cb6e9752 100644
--- a/src/pages/createQuize/MyQuizzesFull.tsx
+++ b/src/pages/createQuize/MyQuizzesFull.tsx
@@ -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 (
<>
@@ -98,6 +106,7 @@ export default function MyQuizzesFull({
).toFixed(1)
: 0
}
+ onClickCopy={onClickCopy}
/>
);
})}
diff --git a/src/pages/createQuize/QuizCard.tsx b/src/pages/createQuize/QuizCard.tsx
index 8de7c7af..cf73a6c8 100755
--- a/src/pages/createQuize/QuizCard.tsx
+++ b/src/pages/createQuize/QuizCard.tsx
@@ -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({
},
}}
/> */}
+ onClickCopy(quiz.id)}
+ sx={{ borderRadius: "6px", padding: "0 4px" }}
+ >
+
+
{
});
};
-// 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,