import React, { useState, useEffect, useMemo, useRef } from 'react'; import { Controller, set, useForm } from 'react-hook-form'; import HookFormSelect from '@/core/components/elements/Select/HookFormSelect'; import odooApi from '~/libs/odooApi'; import stateApi from '@/lib/address/api/stateApi.js'; import cityApi from '@/lib/address/api/cityApi'; import { Radio, RadioGroup, Stack, Checkbox } from '@chakra-ui/react'; import { usePengajuanTempoStore } from '../../../../src-migrate/modules/register/stores/usePengajuanTempoStore'; const informasiPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi, }) => { const { control, watch, setValue, getValues } = useForm(); const { form, errors, validate, updateForm } = usePengajuanTempoStore(); const [industries, setIndustries] = useState([]); const [selectedCategory, setSelectedCategory] = useState(''); const [states, setState] = useState([]); const [cities, setCities] = useState([]); const [bersedia, setBersedia] = useState(null); const category_produk = [ { id: 1, name: 'Pengaman, Kesehatan & Keamanan' }, { id: 2, name: 'Perkakas Tangan, Listrik & Pneumatic' }, { id: 3, name: 'Mesin Industrial' }, { id: 4, name: 'Mesin Pertanian & Perkebunan' }, { id: 5, name: 'Mesin Pembersih & Janitorial' }, { id: 6, name: 'Cairan Berbahan Kimia' }, { id: 7, name: 'Perlengkapan Pengukuran & Pengujian' }, { id: 8, name: 'Peralatan Listrik & Elektronik' }, { id: 9, name: 'Perlengkapan Logistik & Gudang' }, { id: 10, name: 'Peralatan Kantor & Stationery' }, { id: 11, name: 'Komponen & Aksesoris' }, { id: 12, name: 'Peralatan Horeca & Food Service' }, ]; const radioOptions = [ { label: '5.000.000', value: '5000000' }, { label: '10.000.000', value: '10000000' }, { label: '15.000.000', value: '15000000' }, { label: '20.000.000', value: '20000000' }, { label: '25.000.000', value: '25000000' }, { label: '30.000.000', value: '30000000' }, { label: '35.000.000', value: '35000000' }, ]; useEffect(() => { const loadState = async () => { let dataState = await stateApi(); dataState = dataState.map((state) => ({ value: state.id, label: state.name, })); setState(dataState); }; loadState(); }, []); const watchState = watch('state'); useEffect(() => { updateForm('city', ''); if (watchState) { updateForm('state', `${watchState}`); validate(); const loadCities = async () => { let dataCities = await cityApi({ stateId: watchState }); dataCities = dataCities.map((city) => ({ value: city.id, label: city.name, })); setCities(dataCities); }; loadCities(); } }, [watchState]); const watchCity = watch('city'); useEffect(() => { if (watchCity) { updateForm('city', `${watchCity}`); validate(); } }, [watchCity]); useEffect(() => { const loadIndustries = async () => { const dataIndustries = await odooApi('GET', '/api/v1/partner/industry'); setIndustries( dataIndustries?.map((o) => ({ value: o.id, label: o.name, category: o.category, })) ); }; loadIndustries(); }, []); useEffect(() => { const selectedIndustryType = industries.find( (industry) => industry.value === watch('industry_id') ); if (selectedIndustryType) { updateForm('industry_id', `${selectedIndustryType?.value}`); validate(); setSelectedCategory(selectedIndustryType.category); } }, [watch('industry_id'), industries]); const estimasiValue = watch('estimasi'); const tempoLimitValue = watch('tempoLimit'); // Memformat angka menjadi format rupiah const formatRupiah = (value) => { if (!value) return ''; const numberString = value.replace(/[^0-9]/g, ''); // Menghapus karakter non-digit return numberString ? 'Rp ' + new Intl.NumberFormat('id-ID').format(numberString) : ''; }; const handleChange = (e) => { const value = e.target.value; const formattedValue = formatRupiah(value); updateForm('estimasi', formattedValue.replace(/^Rp\s*/, '')); validate(); }; const onChangeTempoDuration = (e) => { updateForm('tempoDuration', `${e}`); validate(); }; const onChangeTempoLimit = (e) => { updateForm('tempoLimit', `${e}`); validate(); }; const [isCustom, setIsCustom] = React.useState(false); const [tempoLimitValueEx, setTempoLimitValueEx] = React.useState(''); const handleCheckboxBersediaChange = (value) => { // if (value === 'bersedia') { // setBersedia(true); // } else if (value === 'tidakBersedia') { // setBersedia(false); // } // updateForm('bersedia', `${value === 'bersedia'}`); updateForm('bersedia', `${value}`); validate(); }; const [selectedIds, setSelectedIds] = useState( form.categoryProduk ? form.categoryProduk.split(',').map(Number) : [] // Parse string menjadi array angka ); const handleCheckboxChange = (id) => { const updatedSelected = selectedIds.includes(id) ? selectedIds.filter((selectedId) => selectedId !== id) : [...selectedIds, id]; setSelectedIds(updatedSelected); // Mengubah array kembali menjadi string yang dipisahkan oleh koma updateForm('categoryProduk', updatedSelected.join(',')); validate(); }; useEffect(() => { if (form.categoryProduk) { setSelectedIds(form.categoryProduk.split(',').map(Number)); // Parse string menjadi array angka } }, [form.categoryProduk]); const isChecked = (id) => selectedIds.includes(id); const handleInputChange = (event) => { const { name, value } = event.target; updateForm(name, value); validate(); }; const midIndex = Math.ceil(category_produk.length / 2); const firstColumn = category_produk.slice(0, midIndex); const secondColumn = category_produk.slice(midIndex); const isFormValid = useMemo(() => Object.keys(errors).length === 0, [errors]); const nameRef = useRef(null); const industry_idRef = useRef(null); const streetRef = useRef(null); const stateRef = useRef(null); const cityRef = useRef(null); const zipRef = useRef(null); const mobileRef = useRef(null); const bankNameRef = useRef(null); const accountNameRef = useRef(null); const accountNumberRef = useRef(null); const estimasiRef = useRef(null); const tempoDurationRef = useRef(null); const bersediaRef = useRef(null); const categoryProdukRef = useRef(null); const tempoLimitRef = useRef(null); useEffect(() => { const loadIndustries = async () => { if (!isFormValid) { const options = { behavior: 'smooth', block: 'center', }; if (errors.name && nameRef.current) { nameRef.current.scrollIntoView(options); return; } if (errors.industry_id && industry_idRef.current) { industry_idRef.current.scrollIntoView(options); return; } if (errors.street && streetRef.current) { streetRef.current.scrollIntoView(options); return; } if (errors.state && stateRef.current) { stateRef.current.scrollIntoView(options); return; } if (errors.city && cityRef.current) { cityRef.current.scrollIntoView(options); return; } if (errors.zip && zipRef.current) { zipRef.current.scrollIntoView(options); return; } if (errors.mobile && mobileRef.current) { mobileRef.current.scrollIntoView(options); return; } if (errors.bankName && bankNameRef.current) { bankNameRef.current.scrollIntoView(options); return; } if (errors.accountName && accountNameRef.current) { accountNameRef.current.scrollIntoView(options); return; } if (errors.accountNumber && accountNumberRef.current) { accountNumberRef.current.scrollIntoView(options); return; } if (errors.estimasi && estimasiRef.current) { estimasiRef.current.scrollIntoView(options); return; } if (errors.tempoDuration && tempoDurationRef.current) { tempoDurationRef.current.scrollIntoView(options); return; } if (errors.bersedia && bersediaRef.current) { bersediaRef.current.scrollIntoView(options); return; } if (errors.categoryProduk && categoryProdukRef.current) { categoryProdukRef.current.scrollIntoView(options); return; } if (errors.tempoLimit && tempoLimitRef.current) { tempoLimitRef.current.scrollIntoView(options); return; } } }; loadIndustries(); }, [buttonSubmitClick, chekValid]); useEffect(() => { if (form.industry_id) { setValue('industry_id', parseInt(form.industry_id)); } if (form.state) { setValue('state', parseInt(form.state)); } if (form.city) { setValue('city', parseInt(form.city)); } if (form.tempoDuration) { setValue('tempoDuration', form.tempoDuration); } if (form.tempoLimit) { setValue('tempoLimit', form.tempoLimit); } if (form.tempoLimit) { const isValueInOptions = radioOptions.some( (option) => option.value === form.tempoLimit ); if (isValueInOptions) { setValue('tempoLimit', form.tempoLimit); // Set value dari radio options setIsCustom(false); // Pastikan custom tidak aktif } else { setValue('tempoLimit', 'custom'); // Set value ke custom jika tidak termasuk dalam options setIsCustom(true); // Aktifkan custom input setTempoLimitValueEx(form.tempoLimit); // Set nilai input custom ke form.tempoLimit } } }, [form]); return (

Informasi Perusahaan

{!isKonfirmasi && ( isi detail perusahaan sesuai dengan nama yang terdaftar{' '} )}
{!isKonfirmasi && ( Format: PT. INDOTEKNIK DOTCOM GEMILANG )} {chekValid && (
{errors.name}
)}
{!isKonfirmasi && ( isi detail perusahaan sesuai dengan nama yang terdaftar )}
( )} /> {!isKonfirmasi && selectedCategory && ( Kategori : {selectedCategory} )} {chekValid && (
{errors.industry_id}
)}
{!isKonfirmasi && ( alamat sesuai dengan alamat kantor pusat )}
{chekValid && (
{errors.street}
)}
( )} /> {chekValid && (
{errors.state}
)}
( )} /> {chekValid && (
{errors.city}
)}
{chekValid && (
{errors.zip}
)}
{!isKonfirmasi && ( isi no telfon perusahaan yang sesuai )}
{chekValid && (
{errors.mobile}
)}
{!isKonfirmasi && ( Isi detail data bank perusahaan anda )}
{!isKonfirmasi && ( Format: BCA, Mandiri, CIMB, BNI dll )} {chekValid && (
{errors.bankName}
)}
{!isKonfirmasi && ( Format: John Doe )} {chekValid && (
{errors.accountName}
)}
{!isKonfirmasi && ( Format: 01234567896 )} {chekValid && (
{errors.accountNumber}
)}
value.replace(/^Rp\s*/, ''), // Menyimpan hanya angka // })} placeholder='Isi estimasi pembelian produk pertahun' type='text' className='form-input' // padding untuk memberi ruang untuk "RP" value={formatRupiah(form.estimasi)} onChange={handleChange} // Mengatur perubahan input />
{chekValid && (
{errors.estimasi}
)}
Pilih durasi tempo yang anda inginkan
7 Hari 14 Hari 30 Hari {chekValid && (
{errors.tempoDuration}
)}
{!isKonfirmasi && (
Ajukan nilai limit yang anda mau
{ if (value === 'custom') { setIsCustom(true); updateForm('tempoLimit', tempoLimitValue); // Update dengan nilai input custom jika dipilih } else { setIsCustom(false); onChangeTempoLimit(value); // Update dengan nilai radio button yang dipilih } }} className='flex items-center justify-between' value={isCustom ? 'custom' : form.tempoLimit} > {/* Kolom 1 */} {radioOptions.slice(0, 4).map((option) => ( {option.label} ))} {/* Kolom 2 */} {radioOptions.slice(4).map((option) => ( {option.label} ))}
{ const value = e.target.value; const formattedValue = formatRupiah(value); setTempoLimitValueEx(formattedValue); updateForm( 'tempoLimit', formattedValue.replace(/^Rp\s*/, '') ); // Mengupdate nilai di react-hook-form }} />
{chekValid && (
{errors.tempoLimit}
)}
)}
{isKonfirmasi && (
Ajukan nilai limit yang anda mau
{ if (value === 'custom') { setIsCustom(true); updateForm('tempoLimit', tempoLimitValue); // Update dengan nilai input custom jika dipilih } else { setIsCustom(false); onChangeTempoLimit(value); // Update dengan nilai radio button yang dipilih } }} className='flex items-center justify-between' value={isCustom ? 'custom' : form.tempoLimit} > {/* Kolom 1 */} {radioOptions.slice(0, 4).map((option) => ( {option.label} ))} {/* Kolom 2 */} {radioOptions.slice(4).map((option) => ( {option.label} ))}
{ const value = e.target.value; const formattedValue = formatRupiah(value); setTempoLimitValueEx(formattedValue); updateForm( 'tempoLimit', formattedValue.replace(/^Rp\s*/, '') ); // Mengupdate nilai di react-hook-form }} />
{chekValid && (
{errors.tempoLimit}
)}
)}
*Durasi dan limit dapat berbeda sesuaui dengan verifikasi oleh tim Indoteknik.com
{!isKonfirmasi && ( Pilih produk bisa lebih dari 1 )}
Saya bersedia Tidak bersedia {/* handleCheckboxBersediaChange('bersedia')} value={true} size='md' > Saya bersedia handleCheckboxBersediaChange('tidakBersedia')} value={false} size='md' > Tidak bersedia */}
{chekValid && (
{errors.estimasi}
)}
{!isKonfirmasi && ( Pilih produk bisa lebih dari 1 )}
{firstColumn.map((item) => ( handleCheckboxChange(item.id)} isChecked={isChecked(item.id)} > {item.name} ))}
{secondColumn.map((item) => ( handleCheckboxChange(item.id)} > {item.name} ))}
{chekValid && (
{errors.categoryProduk}
)}
); }; export default informasiPerusahaan;