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 (
{t('questionnaire.give_us_feedback')}

{questionnaireOrderTitle}

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