diff --git a/src/stores/questions/actions.ts b/src/stores/questions/actions.ts index d9df03bf..e99ae065 100644 --- a/src/stores/questions/actions.ts +++ b/src/stores/questions/actions.ts @@ -10,8 +10,8 @@ import { nanoid } from "nanoid"; import { enqueueSnackbar } from "notistack"; import { isAxiosCanceledError } from "../../utils/isAxiosCanceledError"; import { RequestQueue } from "../../utils/requestQueue"; -import { updateRootContentId } from "@root/quizes/actions" -import { useCurrentQuiz } from "@root/quizes/hooks" +import { updateRootContentId } from "@root/quizes/actions"; +import { useCurrentQuiz } from "@root/quizes/hooks"; import { QuestionsStore, useQuestionsStore } from "./store"; import { withErrorBoundary } from "react-error-boundary"; @@ -90,7 +90,7 @@ const updateQuestionOrders = () => { const questions = useQuestionsStore.getState().questions.filter( (question): question is AnyTypedQuizQuestion => question.type !== null && question.type !== "result" ); - console.log(questions) + console.log(questions); questions.forEach((question, index) => { updateQuestion(question.id, question => { @@ -164,9 +164,9 @@ export const updateQuestion = ( const response = await questionApi.edit(questionToEditQuestionRequest(q)); //Если мы делаем листочек веточкой - удаляем созданный к нему результ - const questionResult = useQuestionsStore.getState().questions.find(questionResult => questionResult.type === "result" && questionResult.content.rule.parentId === q.content.id) - if (questionResult && q.content.rule.default.length !== 0) deleteQuestion(questionResult.quizId) - deleteQuestion + const questionResult = useQuestionsStore.getState().questions.find(questionResult => questionResult.type === "result" && questionResult.content.rule.parentId === q.content.id); + if (questionResult && q.content.rule.default.length !== 0) deleteQuestion(questionResult.quizId); + deleteQuestion; setQuestionBackendId(questionId, response.updated); } catch (error) { if (isAxiosCanceledError(error)) return; @@ -311,13 +311,15 @@ export const createTypedQuestion = async ( if (!question) return; if (question.type !== null) throw new Error("Cannot upgrade already typed question"); + const untypedOrResultQuestionsLength = questions.filter(q => q.type === "result" || q.type === null).length; + try { const createdQuestion = await questionApi.create({ quiz_id: question.quizId, type, title: question.title, description: question.description, - page: questions.length, + page: questions.length - untypedOrResultQuestionsLength, required: false, content: JSON.stringify(defaultQuestionByType[type].content), }); @@ -344,6 +346,8 @@ export const deleteQuestion = async (questionId: string, quizId: string) => requ const question = useQuestionsStore.getState().questions.find(q => q.id === questionId); if (!question) return; + + if (question.type === null) { removeQuestion(questionId); return; @@ -352,45 +356,47 @@ export const deleteQuestion = async (questionId: string, quizId: string) => requ try { await questionApi.delete(question.backendId); if (question.content.rule.parentId === "root") { //удалить из стора root и очистить rule всем вопросам - updateRootContentId(quizId, "") - clearRuleForAll() + updateRootContentId(quizId, ""); + clearRuleForAll(); } else if (question.content.rule.parentId.length > 0) { //удалить из стора вопрос из дерева и очистить его потомков - const clearQuestions = [] as string[] + const clearQuestions = [] as string[]; const getChildren = (parentQuestion: AnyTypedQuizQuestion) => { questions.forEach((targetQuestion) => { if (targetQuestion.content.rule.parentId === parentQuestion.content.id) {//если у вопроса совпал родитель с родителем => он потомок, в кучу его - if (!clearQuestions.includes(targetQuestion.content.id)) clearQuestions.push(targetQuestion.content.id) - getChildren(targetQuestion) //и ищем его потомков + if (!clearQuestions.includes(targetQuestion.content.id)) clearQuestions.push(targetQuestion.content.id); + getChildren(targetQuestion); //и ищем его потомков } - }) - } - getChildren(question) + }); + }; + getChildren(question); //чистим потомков от инфы ветвления clearQuestions.forEach((id) => { updateQuestion(id, question => { - question.content.rule.parentId = "" - question.content.rule.main = [] - question.content.rule.default = "" - }) - }) + question.content.rule.parentId = ""; + question.content.rule.main = []; + question.content.rule.default = ""; + }); + }); //чистим rule родителя - const parentQuestion = getQuestionByContentId(question.content.rule.parentId) - const newRule = {} - newRule.main = parentQuestion.content.rule.main.filter((data) => data.next !== question.content.id) //удаляем условия перехода от родителя к этому вопросу - newRule.parentId = parentQuestion.content.rule.parentId + const parentQuestion = getQuestionByContentId(question.content.rule.parentId); + const newRule = {}; + newRule.main = parentQuestion.content.rule.main.filter((data) => data.next !== question.content.id); //удаляем условия перехода от родителя к этому вопросу + newRule.parentId = parentQuestion.content.rule.parentId; newRule.default = questions.filter((q) => { - return q.content.rule.parentId === question.content.rule.parentId && q.content.id !== question.content.id - })[0]?.content.id || "" + return q.content.rule.parentId === question.content.rule.parentId && q.content.id !== question.content.id; + })[0]?.content.id || ""; //Если этот вопрос был дефолтным у родителя - чистим дефолт //Смотрим можем ли мы заменить id на один из main updateQuestion(question.content.rule.parentId, (PQ) => { - PQ.content.rule = newRule - }) + PQ.content.rule = newRule; + }); } removeQuestion(questionId); + + updateQuestionOrders(); } catch (error) { devlog("Error deleting question", error); enqueueSnackbar("Не удалось удалить вопрос"); @@ -404,8 +410,7 @@ export const copyQuestion = async (questionId: string, quizId: number) => reques const frontId = nanoid(); if (question.type === null) { const copiedQuestion = structuredClone(question); - copiedQuestion.id = frontId - copiedQuestion.content.id = frontId + copiedQuestion.id = frontId; setProducedState(state => { state.questions.push(copiedQuestion); @@ -473,41 +478,41 @@ export const updateDragQuestionContentId = (contentId?: string) => { }; export const clearRuleForAll = () => { - const { questions } = useQuestionsStore.getState() + const { questions } = useQuestionsStore.getState(); questions.forEach(question => { if (question.type !== null && (question.content.rule.main.length > 0 || question.content.rule.default.length > 0 || question.content.rule.parentId.length > 0)) { updateQuestion(question.content.id, question => { - question.content.rule.parentId = "" - question.content.rule.main = [] - question.content.rule.default = "" - }) + question.content.rule.parentId = ""; + question.content.rule.main = []; + question.content.rule.default = ""; + }); } }); -} +}; export const updateOpenBranchingPanel = (value: boolean) => useQuestionsStore.setState({ openBranchingPanel: value }); let UDTOABM: ReturnType; export const updateDesireToOpenABranchingModal = (contentId: string) => { - useQuestionsStore.setState({ desireToOpenABranchingModal: contentId }) - clearTimeout(UDTOABM) + useQuestionsStore.setState({ desireToOpenABranchingModal: contentId }); + clearTimeout(UDTOABM); UDTOABM = setTimeout(() => { - useQuestionsStore.setState({ desireToOpenABranchingModal: null }) - }, 7000) -} + useQuestionsStore.setState({ desireToOpenABranchingModal: null }); + }, 7000); +}; export const clearDesireToOpenABranchingModal = () => { - useQuestionsStore.setState({ desireToOpenABranchingModal: null }) -} + useQuestionsStore.setState({ desireToOpenABranchingModal: null }); +}; export const updateEditSomeQuestion = (contentId?: string) => { - useQuestionsStore.setState({ editSomeQuestion: contentId === undefined ? null : contentId }) -} + useQuestionsStore.setState({ editSomeQuestion: contentId === undefined ? null : contentId }); +}; export const createFrontResult = (quizId: number, parentContentId?: string) => setProducedState(state => { - const frontId = nanoid() - const content = JSON.parse(JSON.stringify(defaultQuestionByType["result"].content)) - content.id = frontId - if (parentContentId) content.rule.parentId = parentContentId + const frontId = nanoid(); + const content = JSON.parse(JSON.stringify(defaultQuestionByType["result"].content)); + content.id = frontId; + if (parentContentId) content.rule.parentId = parentContentId; state.questions.push({ id: frontId, quizId,