import React, { useState, useEffect, useRef, useMemo } from 'react'; import { __, sprintf } from '@wordpress/i18n'; import { useParams } from 'react-router-dom'; import { head, isEmpty, pathOr } from 'ramda'; import { useForm } from 'react-hook-form'; import 'quill/dist/quill.core.css'; // store import { storeSet, useStore } from '../../store'; // api import ApplicationService from '../../service/application-service'; // tools import { isPIVA, isCodiceFiscale, isCAP, isIBAN, isEmail, isEmailPEC, isUrl, isMarcaDaBollo, minChecks, maxChecks, nonEmptyTables } from '../../helpers/validators'; import renderHtmlContent from '../../helpers/renderHtmlContent'; import set404FromErrorResponse from '../../helpers/set404FromErrorResponse'; // components import { Skeleton } from 'primereact/skeleton'; import { Button } from 'primereact/button'; import FormField from '../../components/FormField'; import { Toast } from 'primereact/toast'; import { Messages } from 'primereact/messages'; import ApplicationSteps from '../BandoApplication/ApplicationSteps'; import BlockingOverlay from '../../components/BlockingOverlay'; const BandoApplicationPreview = () => { const { id } = useParams(); const [formData, setFormData] = useState([]); const [formInitialData, setFormInitialData] = useState(null); const [bandoTitle, setBandoTitle] = useState(''); const [bandoId, setBandoId] = useState(0); const [formId, setFormId] = useState(''); const [totalSteps, setTotalSteps] = useState(0); const [applicationStatus, setApplicationStatus] = useState(''); const [activeStep, setActiveStep] = useState(1); const isAsyncRequest = useStore().main.isAsyncRequest(); const toast = useRef(null); const formMsgs = useRef(null); const { control, handleSubmit, formState: { errors }, setValue, trigger, register, getValues, reset } = useForm({ defaultValues: useMemo(() => { return formInitialData ? formInitialData : {} }, [formInitialData]), mode: 'onChange' }); const validationFns = { isPIVA, isCodiceFiscale, isCAP, isIBAN, isEmail, isEmailPEC, isUrl, isMarcaDaBollo, minChecks, maxChecks, nonEmptyTables } const activeStepIndex = activeStep - 1; const values = getValues(); const onValidate = () => { const applId = getApplicationId(); storeSet.main.setAsyncRequest(); formMsgs.current.clear(); ApplicationService.validateApplication(applId, {}, validateApplicationCallback, errValidateApplicationCallback); }; const onSubmit = () => { }; const validateApplicationCallback = (data) => { if (data.status === 'SUCCESS') { toast.current.show({ severity: 'success', summary: '', detail: data.message }); } storeSet.main.unsetAsyncRequest(); } const errValidateApplicationCallback = (data) => { if (toast.current) { toast.current.show({ severity: 'error', summary: '', detail: data.message }); } storeSet.main.unsetAsyncRequest(); } const saveDraft = (saveAndMove = '') => { trigger(); } const getApplicationId = () => { const parsed = parseInt(id) return !isNaN(parsed) ? parsed : 0; } const goBackward = () => { storeSet.main.setAsyncRequest(); ApplicationService.getApplicationForm(id, getApplFormCallback, errGetApplFormCallbacks, [ ['formId', formId], ['action', 'PREVIOUS'] ]); } const goForward = () => { storeSet.main.setAsyncRequest(); ApplicationService.getApplicationForm(id, getApplFormCallback, errGetApplFormCallbacks, [ ['formId', formId], ['action', 'NEXT'] ]); } const getApplFormCallback = (data) => { if (data.status === 'SUCCESS') { setBandoTitle(data.data.callTitle); setBandoId(data.data.callId); setFormData(data.data.applicationFormResponse.content); setFormId(data.data.formId); setTotalSteps(data.data.totalFormSteps); setApplicationStatus(data.data.applicationStatus) setActiveStep(data.data.currentStep); /*const chosenCompanyId = storeGet.main.chosenCompanyId(); const companies = storeGet.main.companies(); const company = head(companies.filter(o => o.id === chosenCompanyId));*/ let formDataInitial = {}; let dynamicData = { company: {}, user: {} }; /*if (company) { dynamicData = Object.keys(company).reduce((acc, cur) => { if ([ 'companyName', 'vatNumber', 'codiceFiscale', 'address', 'phoneNumber', 'city', 'province', 'cap', 'country', 'pec', 'email', 'contactName', 'contactEmail' ].includes(cur)) { acc.company[cur] = company[cur]; } return acc; }, dynamicData); } const userData = storeGet.main.userData(); Object.keys(userData).reduce((acc, cur) => { if ([ 'email', 'firstName', 'lastName', 'phoneNumber', 'codiceFiscale' ].includes(cur)) { acc.user[cur] = userData[cur]; } if (['dateOfBirth'].includes(cur)) { acc.user[cur] = new Date(userData[cur]); } return acc; }, dynamicData);*/ if (data.data.applicationFormResponse.content) { // eslint-disable-next-line array-callback-return data.data.applicationFormResponse.content.map((o) => { if (o.dynamicData && !isEmpty(o.dynamicData)) { formDataInitial[o.id] = pathOr('', o.dynamicData.split('.'), dynamicData); } }) } if (data.data.applicationFormResponse.formFields) { const submitData = data.data.applicationFormResponse.formFields.map((o) => ({ fieldId: o.fieldId, fieldValue: o.fieldValue })); formDataInitial = submitData.reduce((acc, cur) => { if (cur.fieldValue) { acc[cur.fieldId] = cur.fieldValue; } return acc; }, formDataInitial); } reset(); setFormInitialData(formDataInitial); } storeSet.main.unsetAsyncRequest(); } const errGetApplFormCallbacks = (data) => { storeSet.main.unsetAsyncRequest(); if (data.status === 'VALIDATION_ERROR') { if (toast.current) { toast.current.show({ severity: 'error', summary: '', detail: data.message }); } } else { set404FromErrorResponse(data); } } const onDownloadApplicationPdf = () => { const applId = getApplicationId(); storeSet.main.setAsyncRequest(); ApplicationService.downloadApplicationPdf(applId, {}, getPdfCallback, errPdfCallback); } const getPdfCallback = (data) => { const applId = getApplicationId(); const pdfFile = new Blob([data], { type: 'application/octet-stream' }) const url = window.URL.createObjectURL(pdfFile); const link = document.createElement('a'); link.href = url; link.setAttribute('download', `application-${applId}.pdf`); document.body.appendChild(link); link.click(); link.remove(); storeSet.main.unsetAsyncRequest(); } const errPdfCallback = (data) => { set404FromErrorResponse(data); storeSet.main.unsetAsyncRequest(); } const actionBtns =