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 (

{questionnaireOrderTitle}

{t('commons:questionnaire_modal.more_satisfied_services')}

{t('commons:questionnaire_modal.strive_to_improve_services')}

{t('questionnaire.no_answer')}
{t('questionnaire.disagree')} {t('questionnaire.agree')}
{questionnaireOrder.questions?.map((question) => { return ; })}
{t('questionnaire.dont_show_again')}
{currentUser?.admin && ( admin_panel_settings )} {currentUser != null && ( settings )}
); }; export default QuestionnaireModal;