school-dashboard-exercise/src/Pages/question/AddPage.tsx
2024-08-07 16:23:25 +03:00

219 lines
6.4 KiB
TypeScript

import React, { Suspense, lazy, useEffect } from "react";
import { Modal, Spin } from "antd";
import FormikForm from "../../Layout/Dashboard/FormikFormModel";
import {
getInitialValues,
getValidationSchema,
getInitialValuesBase,
getValidationSchemaBase,
processTags,
} from "./Model/formUtil";
import { useAddQuestion, useAddQuestionAsync } from "../../api/Question";
import { useTranslation } from "react-i18next";
import { useNavigate, useParams } from "react-router-dom";
import { ParamsEnum } from "../../enums/params";
import { useObjectToEdit } from "../../zustand/ObjectToEditState";
import Header from "../../Components/exercise/Header";
import { Question } from "../../types/Item";
import BaseForm from "./Model/Malty/Add";
import Form from "./Model/Add";
const AcceptModal = lazy(() => import("./Model/AcceptModal"));
import { useModalState } from "../../zustand/Modal";
import { ModalEnum } from "../../enums/Model";
import { cleanObject } from "../../utils/cleanObject";
import { hasItems } from "../../utils/hasItems";
import { QUESTION_OBJECT_KEY } from "../../config/AppKey";
import useSaveOnDisconnect from "../../Hooks/useSaveOnDisconnect";
import { getLocalStorageQuestions } from "../../utils/setLocalStorageQuestions";
import { toast } from "react-toastify";
import useSetPageTitle from "../../Hooks/useSetPageTitle";
import { useGetAllUnit } from "../../api/unit";
import { useGetAllLesson } from "../../api/lesson";
const AddPage: React.FC = () => {
const { isSuccess: isSuccessAsync, mutateAsync } = useAddQuestionAsync();
const { mutate, isSuccess, isLoading } = useAddQuestion();
const {
isBseQuestion,
setTagsSearch,
setObjectToEdit,
setSuccess,
SavedQuestionData,
} = useObjectToEdit();
const { subject_id, lesson_id, unit_id } = useParams<ParamsEnum>();
const { setIsOpen } = useModalState((state) => state);
const { data: unit } = useGetAllUnit({ show: unit_id });
const { data: lesson } = useGetAllLesson({ show: lesson_id });
const [t] = useTranslation();
const unitName = unit?.data?.name ?? "";
const SubjectName = unit?.data?.subject?.name ?? "";
const lessonName = lesson?.data?.name ?? "";
useSetPageTitle(
t(`page_header.subject`) +
"/" +
`${SubjectName}` +
"/" +
t(`PageTitle.unit`) +
"/" +
`${unitName}` +
"/" +
t(`PageTitle.lesson`) +
"/" +
`${lessonName}` +
"/" +
t(`PageTitle.questions`),
);
const handleSubmit = (
values: any,
{ resetForm }: { resetForm: () => void },
) => {
const DataToSend = structuredClone(values);
setTagsSearch(null);
console.log(isBseQuestion);
if (isBseQuestion || DataToSend?.isBase === 1) {
const newBseQuestion = {
subject_id: subject_id,
content: DataToSend?.content,
image: DataToSend?.image ?? "",
isBase: 1,
lessons_ids: [lesson_id],
};
mutateAsync(newBseQuestion).then((data: any) => {
const newBseQuestionId = (data as any)?.data?.id;
const Questions = DataToSend?.Questions;
console.log(1);
Questions?.map((item: Question) => {
const tags = processTags(item);
console.log(item);
mutate({
...item,
parent_id: newBseQuestionId,
subject_id: subject_id,
tags,
lessons_ids: [lesson_id],
});
});
console.log(newBseQuestionId, "newBseQuestionId");
});
} else {
const tags = processTags(DataToSend);
mutate({
...values,
subject_id: subject_id,
tags,
lessons_ids: [lesson_id],
});
}
};
const navigate = useNavigate();
useEffect(() => {
if (
isSuccessAsync &&
(SavedQuestionData?.Questions?.length > 0 ? isSuccess : true)
) {
setObjectToEdit(null);
setSuccess(true);
localStorage.removeItem(QUESTION_OBJECT_KEY);
}
if (isSuccess && !SavedQuestionData?.Questions?.length) {
toast.success(t("validation.the_possess_done_successful"));
setObjectToEdit(null);
setSuccess(true);
localStorage.removeItem(QUESTION_OBJECT_KEY);
}
}, [isSuccess, isSuccessAsync]);
let cleanedQuestionOptions = cleanObject(SavedQuestionData);
let noChange = hasItems(cleanedQuestionOptions);
useSaveOnDisconnect(noChange, QUESTION_OBJECT_KEY, SavedQuestionData);
const SavedData = getLocalStorageQuestions(QUESTION_OBJECT_KEY);
const handleCancel = () => {
if (!noChange) {
navigate(-1);
localStorage.removeItem(QUESTION_OBJECT_KEY);
} else {
setIsOpen(ModalEnum?.QUESTION_ACCEPT);
}
};
if (isBseQuestion || SavedData?.isBase === 1) {
return (
<div className="exercise_add">
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValuesBase(SavedData)}
validationSchema={getValidationSchemaBase}
>
<main className="w-100 exercise_add_main">
<Header />
<BaseForm />
<div className="exercise_add_buttons">
<div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} className="relative" type="submit">
{t("practical.add")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</FormikForm>
<Suspense fallback={<Spin />}>
<AcceptModal />
</Suspense>
</div>
);
}
return (
<div className="exercise_add">
<FormikForm
handleSubmit={handleSubmit}
initialValues={getInitialValues(SavedData)}
validationSchema={getValidationSchema}
>
<main className="w-100 exercise_add_main">
<Header />
<Form />
<div className="exercise_add_buttons">
<div onClick={handleCancel}>{t("practical.back")}</div>
<button disabled={isLoading} className="relative" type="submit">
{t("practical.add")}
{isLoading && (
<span className="Spinier_Div">
<Spin />
</span>
)}
</button>
</div>
</main>
</FormikForm>
<Suspense fallback={<Spin />}>
<AcceptModal />
</Suspense>
</div>
);
};
export default AddPage;