Untitled
unknown
javascript
4 years ago
10 kB
14
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...