import { useCallback } from 'react';
import { useTranslation } from 'next-i18next';
import { Modal, ModalBody } from 'reactstrap';
import { apiv3Put } from '~/client/util/apiv3-client';
import { toastSuccess, toastError } from '~/client/util/toastr';
import { useQuestionnaireModal } from '~/features/questionnaire/client/stores/model';
import { IAnswer } from '~/features/questionnaire/interfaces/answer';
import { StatusType } from '~/features/questionnaire/interfaces/questionnaire-answer-status';
import { IQuestionnaireOrderHasId } from '~/features/questionnaire/interfaces/questionnaire-order';
import { useCurrentUser } from '~/stores/context';
import loggerFactory from '~/utils/logger';
import { GuestQuestionnaireAnswerStatusService } from '../services/guest-questionnaire-answer-status';
import Question from './Question';
const logger = loggerFactory('growi:QuestionnaireModal');
type QuestionnaireModalProps = {
questionnaireOrder: IQuestionnaireOrderHasId
}
const QuestionnaireModal = ({ questionnaireOrder }: QuestionnaireModalProps): JSX.Element => {
const { data: currentUser } = useCurrentUser();
const lang = currentUser?.lang;
const { data: questionnaireModalData, close: closeQuestionnaireModal } = useQuestionnaireModal();
const isOpened = questionnaireModalData?.openedQuestionnaireId === questionnaireOrder._id;
const inputNamePrefix = 'question-';
const { t } = useTranslation(['translation', 'commons']);
const sendAnswer = useCallback(async(answers: IAnswer[]) => {
try {
await apiv3Put('/questionnaire/answer', {
questionnaireOrderId: questionnaireOrder._id,
answers,
});
if (currentUser == null) {
GuestQuestionnaireAnswerStatusService.setStatus(questionnaireOrder._id, StatusType.answered);
}
toastSuccess(
<>
{t('questionnaire.thank_you_for_answering')}
{t('questionnaire.additional_feedback')}
>,
{
autoClose: 3000,
closeButton: true,
},
);
}
catch (e) {
logger.error(e);
toastError(t('questionnaire.failed_to_send'));
}
}, [questionnaireOrder._id, t, currentUser]);
const submitHandler = useCallback(async(event) => {
event.preventDefault();
const answers: IAnswer[] = questionnaireOrder.questions.map((question) => {
const answerValue = event.target[`${inputNamePrefix + question._id}`].value;
return { question: question._id, value: answerValue };
});
sendAnswer(answers);
const shouldCloseToast = true;
closeQuestionnaireModal(shouldCloseToast);
}, [closeQuestionnaireModal, questionnaireOrder.questions, sendAnswer]);
const denyBtnClickHandler = useCallback(async() => {
try {
apiv3Put('/questionnaire/deny', {
questionnaireOrderId: questionnaireOrder._id,
});
if (currentUser == null) {
GuestQuestionnaireAnswerStatusService.setStatus(questionnaireOrder._id, StatusType.denied);
}
toastSuccess(t('questionnaire.denied'));
}
catch (e) {
logger.error(e);
}
const shouldCloseToast = true;
closeQuestionnaireModal(shouldCloseToast);
}, [closeQuestionnaireModal, questionnaireOrder._id, t, currentUser]);
// No showing toasts since not important
const closeBtnClickHandler = useCallback(async(shouldCloseToast: boolean) => {
closeQuestionnaireModal(shouldCloseToast);
try {
await apiv3Put('/questionnaire/skip', {
questionnaireOrderId: questionnaireOrder._id,
});
if (currentUser == null) {
GuestQuestionnaireAnswerStatusService.setStatus(questionnaireOrder._id, StatusType.skipped);
}
}
catch (e) {
logger.error(e);
}
}, [closeQuestionnaireModal, questionnaireOrder._id, currentUser]);
const closeBtnClickHandlerClosingToast = useCallback(async() => {
closeBtnClickHandler(true);
}, [closeBtnClickHandler]);
const questionnaireOrderTitle = lang === 'en_US' ? questionnaireOrder.title.en_US : questionnaireOrder.title.ja_JP;
return (
);
};
export default QuestionnaireModal;