67 lines
3.6 KiB
TypeScript
67 lines
3.6 KiB
TypeScript
import { AnyTypedQuizQuestion } from "@model/questionTypes/shared";
|
||
import { clearRuleForAll, deleteQuestion, getQuestionByContentId, updateQuestion } from "@root/questions/actions";
|
||
import { updateRootContentId } from "@root/quizes/actions";
|
||
|
||
//Всё здесь нужно сделать последовательно. И пусть весь мир ждёт.
|
||
|
||
export const DeleteFunction = async (questions: any, question: any, quiz: any) => {
|
||
|
||
|
||
if (question.type !== null) {
|
||
if (question.content.rule.parentId === "root") { //удалить из стора root и очистить rule всем вопросам
|
||
updateRootContentId(quiz.id, "");
|
||
await clearRuleForAll();
|
||
console.log("очистка рулов закончилась")
|
||
await deleteQuestion(question.id);
|
||
} else if (question.content.rule.parentId.length > 0) { //удалить из стора вопрос из дерева и очистить его потомков
|
||
const clearQuestions = [] as string[];
|
||
|
||
//записываем потомков , а их результаты удаляем
|
||
const getChildren = (parentQuestion: AnyTypedQuizQuestion) => {
|
||
questions.forEach((targetQuestion) => {
|
||
if (targetQuestion.type !== null && targetQuestion.content.rule.parentId === parentQuestion.content.id) {//если у вопроса совпал родитель с родителем => он потомок, в кучу его
|
||
if (targetQuestion.type !== "result" && targetQuestion.type !== null) {
|
||
if (!clearQuestions.includes(targetQuestion.content.id)) clearQuestions.push(targetQuestion.content.id);
|
||
getChildren(targetQuestion); //и ищем его потомков
|
||
}
|
||
}
|
||
});
|
||
};
|
||
getChildren(question);
|
||
//чистим потомков от инфы ветвления
|
||
await Promise.allSettled(
|
||
clearQuestions.map((id) => {
|
||
updateQuestion(id, question => {
|
||
question.content.rule.parentId = "";
|
||
question.content.rule.children = [];
|
||
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;
|
||
newRule.default = parentQuestion.content.rule.parentId === question.content.id ? "" : parentQuestion.content.rule.parentId;
|
||
newRule.children = [...parentQuestion.content.rule.children].splice(parentQuestion.content.rule.children.indexOf(question.content.id), 1);
|
||
|
||
await updateQuestion(question.content.rule.parentId, (PQ) => {
|
||
PQ.content.rule = newRule;
|
||
});
|
||
await deleteQuestion(question.id);
|
||
}
|
||
|
||
await deleteQuestion(question.id);
|
||
|
||
const result = questions.find(q => q.type === "result" && q.content.rule.parentId === question.content.id)
|
||
if (result) await deleteQuestion(result.id);
|
||
|
||
} else {
|
||
await deleteQuestion(question.id);
|
||
}
|
||
|
||
} |