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,