Untitled
unknown
javascript
4 years ago
10 kB
6
Indexable
import React, { useState, useEffect } from 'react'; import { useSelector } from 'react-redux'; import { Form, } from "antd"; import B2BConfig from '@/configs/B2BConfig'; import AlamatForm from "@/component/b2bForms/basic/AlamatForm"; import FileInputField from '@/component/b2bFields/FileInputField'; import FormSubtitleSection from "@/component/b2bForms/basic/FormSubtitleSection"; import InfoPJField from "@/component/b2bFields/InfoPJField"; import Api from '@/configs/Api'; import BaseConfig from '@/configs/BaseConfig'; import Helper from '@/helpers/Helper'; import Router from 'next/router' import CustomFieldHelper from '@/helpers/CustomFieldHelper'; import InfoPerusahaanHelper from "@/helpers/b2b/InfoPerusahaanHelper"; const moment = require('moment'); const formItemLayout = { labelCol: { xs: { span: 24, }, sm: { span: 24, }, }, wrapperCol: { xs: { span: 24, }, sm: { span: 24, }, }, }; export default function FotoUsahaEntity() { const pageData = useSelector(state => state.b2bRegistration); const b2bFormRedux = useSelector(state => state.b2bForm); const [form] = Form.useForm(); const [formLayout, setFormLayout] = useState('vertical'); const [isLoading, setisLoading] = useState(false); const [requiredValidation, setrequiredValidation] = useState(true); let initialMaritalStatus = null; // Set Company const company = B2BConfig.LIST.findItem(pageData.kind); company.full_name = B2BConfig.LIST.getFullStr(company.id); // For Edit Data let applicantId = null; let applicantB2BId = null; // check if b2bFormRedux.Applicant.ID exist if(Helper.getNestedObject(b2bFormRedux, "Applicant", "ID")) { applicantId = b2bFormRedux.Applicant.ID; } // endif if(Helper.getNestedObject(b2bFormRedux, "ApplicantB2B", "ID")) { applicantB2BId = b2bFormRedux.ApplicantB2B.ID; } // endif let formInitialValue = null; formInitialValue = {}; // Use this Helper, to prevent all object updated using same value while updating single object. const defaultCustomField = () => { return { isError: false, files: [], // to store current file from API GET url: null } } let tempCustomField = { FileInventoryPhoto: defaultCustomField(), FileBusinessActivityPhoto: defaultCustomField(), } // Will have error if empty when validator active const requiredCustomField = [ "FileInventoryPhoto", "FileBusinessActivityPhoto" ]; if(Helper.getNestedObject(b2bFormRedux, "ApplicantB2B", "BusinessActivity")) { const fileUrlParam = { apiObject: b2bFormRedux.ApplicantB2B, tempCustomField: tempCustomField } console.log("tempCustomField FotoUsaha", tempCustomField); // set initial state } // endif const [customFields, setcustomFields] = useState(tempCustomField); const onCustomFieldChanged = (event, fieldName) => { const temporaryField = customFields; temporaryField[fieldName].files = event.target.files; setcustomFields(temporaryField); } const onCustomFieldRemoved = (fieldName) => { const temporaryField = customFields; temporaryField[fieldName].files = []; setcustomFields(temporaryField); } // reset after submit, so will not trigger on first tab click const resetSimpanVerifikasiTrigger = () => { const companyState = {...pageData, simpan_formulir_click_at: 0, kirim_verifikasi_click_at: 0, } ReduxStore.dispatch({ type: "b2bregistration/set_data", payload: companyState, }); } const hasB2BIdCheck = () => { if(! applicantB2BId) { GModal.error({ content: "Mohon untuk mengisi Informasi Perusahaan terlebih dahulu." }); resetSimpanVerifikasiTrigger(); // Back to Info Perusahaan Tab const companyState = {...pageData, active_doctab: B2BConfig.BASIC_DOCUMENT_TABS.DTABS_INFO_PERUSAHAAN } ReduxStore.dispatch({ type: 'b2bregistration/set_data', payload: companyState }); return false; } // endif return true; } useEffect(() => { hasB2BIdCheck(); }, []); // When Kirim untuk verifikasi Clicked, do: useEffect(() => { if(onThisPageCheck(pageData) && (pageData.kirim_verifikasi_click_at) && hasB2BIdCheck()) { console.log("kirim_verifikasi_click_at: triggered"); setrequiredValidation(true); form.submit(); } // endif }, [pageData.kirim_verifikasi_click_at]); // When Simpan Formulir Clicked, do: useEffect(() => { if(onThisPageCheck(pageData) && pageData.simpan_formulir_click_at && hasB2BIdCheck()) { console.log("simpan_formulir_click_at: triggered"); // @TODO(albert): SHOULD BE FALSE, after API FIX setrequiredValidation(true); form.submit(); } // end if }, [pageData.simpan_formulir_click_at]); const onThisPageCheck = (pageData) => { const isMatchStep = pageData.step == B2BConfig.STEP_DOCS.ADVANCE; const isMatchActiveTab = pageData.active_doctab.title == B2BConfig.ADV_DOCUMENT_TABS.DTABS_FOTO_USAHA.title; if(isMatchStep && isMatchActiveTab) { return true; } // endif return false; } const onFinish = (values) => { const requestBody = values; const isCustomFieldValidated = validateCustomField(); console.log('Received values of form: ', requestBody); if(isCustomFieldValidated) { doSaveFormDraft(values); } else { resetSimpanVerifikasiTrigger(); GModal.error({ content: "Belum dapat menyimpan Foto Usaha. Pastikan sudah meng-upload berkas yang dibutuhkan." }); } // endif }; const onFinishFailed = ({ values, errorFields, outOfDate }) => { resetSimpanVerifikasiTrigger(); } const doSaveFormDraft = async (requestBody) => { setisLoading(true); const requestFormData = new FormData(); // `[['BUF', 11], ['MIA', 9], ...]` const reqBodyArray = Object.entries(requestBody); const customFieldArray = Object.entries(customFields); reqBodyArray.forEach((item) => { // Format Date if set if(moment.isMoment(item[1])) { item[1] = item[1].format('YYYY-MM-DD'); } // endif // Ignore undefined value, keep 0 value. if(! item[1] && (item[1] != 0)) { // skip } else { requestFormData.append(item[0], item[1]); } }); // Add customFields to formData customFieldArray.forEach((item) => { // only if has Files if((item[1].files.length > 0)) { requestFormData.append(item[0], item[1].files[0]); } else { // skip } }); console.log("requestFormData", requestFormData); // console.log(postApplicantB2B); try { // if has no b2b id, create new, else put update let response; if(! applicantB2BId) { response = await Api.AXIOS_FORM.post(Api.APPLICANT.B2B_POST(applicantId, applicantB2BId), requestFormData); } else { response = await Api.AXIOS_FORM.put(Api.APPLICANT.B2B_PUT(applicantId, applicantB2BId), requestFormData); } ReduxStore.dispatch({ type: 'b2bform/set_data', payload: {...b2bFormRedux, ApplicantB2B: response.data.Data } }); GModal.info({ content: "Foto Usaha berhasil disimpan." }); setisLoading(false); if(pageData.kirim_verifikasi_click_at > 0) { Router.push('/b2b-register/verifikasi'); } // endif } catch (e) { console.log(e); GModal.error({ content: "Gagal menyimpan Foto Usaha. Cek log untuk detail." }); setisLoading(false); } resetSimpanVerifikasiTrigger(); } const doSendForVerification = () => { } /** * using param requiredValidationParam, instead of direact requiredValidationParam * bcz requiredValidationParam is a state, which will delay if called inside useEffect * this function also called inside useEffect(), so need to make sure, requiredValidationParam is not delayed */ const validateCustomField = (requiredValidationParam=null) => { if(requiredValidationParam == null) { requiredValidationParam = requiredValidation; } // endif let temporaryFields = customFields; const validatorArray = requiredCustomField.map((item) => { const field = temporaryFields[item]; if(! requiredValidationParam) { temporaryFields[item].isError = false; return true; } // If files is empty and url is empty, should error else if((field.files.length < 1) && (! field.url)) { temporaryFields[item].isError = true; return false; } else { temporaryFields[item].isError = false; return true; } }); // temporaryFields should updated inside map() function setcustomFields(temporaryFields); console.log("validateCustomField", requiredValidationParam, customFields); // Validator array should not contain false return (! validatorArray.includes(false)); // Do Validation } return ( <> <Form {...formItemLayout} form={form} layout={formLayout} name="register" onFinish={onFinish} onFinishFailed={onFinishFailed} initialValues={formInitialValue} scrollToFirstError > <FormSubtitleSection subtitle="Foto Usaha" // smallTitle={"Penanggung jawab perusahaan adalah " + company.pj} noMarginTop={true} /> <FileInputField.CustomFieldSingleInput name="FileBusinessActivityPhoto" label="Foto Kantor Yang Menggambarkan Aktifitas Usaha" validationMsg="Foto Kantor Yang Menggambarkan Aktifitas Usaha harus di upload" customFields={customFields} setcustomFields={setcustomFields} exampleButton={true} exampleUrl="https://www.google.com/" /> <FileInputField.CustomFieldSingleInput name="FileInventoryPhoto" label="Foto Inventaris" validationMsg="Foto Inventaris harus di upload" customFields={customFields} setcustomFields={setcustomFields} isOptionalField={true} exampleButton={true} exampleUrl="https://www.google.com/" /> </Form> </> ); }
Editor is loading...