import { useCallback } from 'react';
import { useTranslation } from 'next-i18next';
import {
Modal, ModalHeader, ModalBody, ModalFooter,
} from 'reactstrap';
import { apiv3Put } from '~/client/util/apiv3-client';
import { toastSuccess, toastError } from '~/client/util/toastr';
import { IAnswer } from '~/interfaces/questionnaire/answer';
import { IQuestionnaireOrderHasId } from '~/interfaces/questionnaire/questionnaire-order';
import { useCurrentUser } from '~/stores/context';
import { useQuestionnaireModal } from '~/stores/modal';
import loggerFactory from '~/utils/logger';
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();
const sendAnswer = useCallback(async(answers: IAnswer[]) => {
try {
await apiv3Put('/questionnaire/answer', {
questionnaireOrderId: questionnaireOrder._id,
answers,
});
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]);
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);
closeQuestionnaireModal();
}, [closeQuestionnaireModal, questionnaireOrder.questions, sendAnswer]);
const skipBtnClickHandler = useCallback(async() => {
try {
apiv3Put('/questionnaire/skip', {
questionnaireOrderId: questionnaireOrder._id,
});
toastSuccess(t('questionnaire.skipped'));
}
catch (e) {
logger.error(e);
toastError(t('questionnaire.failed_to_skip'));
}
closeQuestionnaireModal();
}, [closeQuestionnaireModal, questionnaireOrder._id, t]);
// No showing toasts since not important
const closeBtnClickHandler = useCallback(async() => {
closeQuestionnaireModal();
try {
await apiv3Put('/questionnaire/deny', {
questionnaireOrderId: questionnaireOrder._id,
});
}
catch (e) {
logger.error(e);
}
}, [closeQuestionnaireModal, questionnaireOrder._id]);
const questionnaireOrderTitle = lang === 'en_US' ? questionnaireOrder.title.en_US : questionnaireOrder.title.ja_JP;
return (
);
};
export default QuestionnaireModal;