import React, { useMemo, useState, useCallback, useEffect, useRef } from 'react'; import { useForm, useFieldArray } from 'react-hook-form'; import { isEmpty, head, pluck } from 'ramda'; import { __ } from '@wordpress/i18n'; import { klona } from 'klona'; // tools import uniqid from '../../../../helpers/uniqid'; // components import FormField from '../../../../components/FormField'; import { Button } from 'primereact/button'; import { Dialog } from 'primereact/dialog'; import { Toast } from 'primereact/toast'; import CompanyService from '../../../../service/company-service'; import FileSelect from '../../../../components/FormField/components/FileSelect'; import ApplicationService from '../../../../service/application-service'; import set404FromErrorResponse from '../../../../helpers/set404FromErrorResponse'; import { storeSet } from '../../../../store'; const EvaluationExtraFiles = ({ sourceId, applicationId, companyId, sourceName, updateFn = () => { }, updateCallbackFn = () => { }, defaultValue = [], shouldDisable = false }) => { const [chosen, setChosen] = useState(''); const [isVisibleCompanyDocsDialog, setIsVisibleCompanyDocsDialog] = useState(false); const [companyDocs, setCompanyDocs] = useState([]); const [companyDocsSelected, setCompanyDocsSelected] = useState([]); const toast = useRef(null); const { control, handleSubmit, formState: { errors }, setValue, register, trigger, getValues, watch } = useForm({ defaultValues: useMemo(() => { return { items: defaultValue || [] }; }, [defaultValue]), mode: 'onChange' }); const { fields, append, remove } = useFieldArray({ control, name: 'items' }); const watchFields = watch('items'); const onSubmit = () => { } const doUpdateAfterFileUploaded = () => { const formData = getValues(); updateFn(formData.items); updateCallbackFn(formData.items); } const addNew = () => { const uid = uniqid('f'); const newItem = { fieldId: uid, nameValue: '', fileValue: [] } append(newItem); setChosen(newItem.fieldId); trigger(); }; const setNewChosen = useCallback((id) => { const chosenObj = head(fields.filter(o => id === o.fieldId)); if (chosenObj) { setChosen(chosen === id ? '' : id); } }, [fields, chosen]); const removeItem = useCallback((index) => { const chosenObj = klona(fields[index]); remove(index); if (chosen === chosenObj.fieldId) { setChosen(''); } const formData = getValues(); updateFn(formData.items); updateCallbackFn(formData.items); }, [fields, chosen]); const openCompanyArchive = () => { setIsVisibleCompanyDocsDialog(true); } const headerCompanyDocsDialog = () => { return {__('Documenti aziendale', 'gepafin')}; } const hideCompanyDocsDialog = () => { setIsVisibleCompanyDocsDialog(false); setCompanyDocsSelected([]); } const footerPreTecEvalDialog = useCallback(() => { return
}, [companyDocsSelected]); const doImportCompanyDocs = useCallback(() => { if (!isEmpty(companyDocsSelected)) { const ids = pluck('id', companyDocsSelected); ApplicationService.setApplicationDocuments(applicationId, setDocsCallback, errSetDocsCallback, [ ['companyDocumentIds', ids] ]) } }, [companyDocsSelected]); const setDocsCallback = (resp) => { if (resp.status === 'SUCCESS') { if (toast.current && resp.message) { toast.current.show({ severity: 'success', summary: '', detail: resp.message }); } } setIsVisibleCompanyDocsDialog(false); setCompanyDocsSelected([]); storeSet('unsetAsyncRequest'); setTimeout(() => { window.location.reload(); }, 2500); } const errSetDocsCallback = (resp) => { if (toast.current && resp.message) { toast.current.show({ severity: resp.status === 'SUCCESS' ? 'info' : 'error', summary: '', detail: resp.message }); } setIsVisibleCompanyDocsDialog(false); setCompanyDocsSelected([]); set404FromErrorResponse(resp); storeSet('unsetAsyncRequest'); } const getDocsCallback = (resp) => { if (resp.status === 'SUCCESS') { setCompanyDocs(resp.data); } } const errGetDocsCallback = (resp) => { if (toast.current && resp.message) { toast.current.show({ severity: resp.status === 'SUCCESS' ? 'info' : 'error', summary: '', detail: resp.message }); } set404FromErrorResponse(resp); } useEffect(() => { CompanyService.getCompanyDocuments(companyId, getDocsCallback, errGetDocsCallback, [ ['documentType', 'COMPANY_DOCUMENT'] ]) }, [companyId]); return ( <>
{watchFields ? watchFields.map((o, index) =>
setNewChosen(o.fieldId)}>{o.nameValue}
) : null}
{/**/} {}} key={companyDocsSelected} defaultValue={companyDocsSelected} options={companyDocs} sourceId="0" source="DOCUMENT" documentCategories={[]} attachFilesCallback={(o) => { setCompanyDocsSelected(prev => { const newSelected = [...prev]; if (!newSelected.find(s => s.id === o.id)) { newSelected.push(o); } return newSelected; }) }} />
) } export default EvaluationExtraFiles;