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 { usePengajuanTempoStorePengiriman, usePengajuanTempoStore, } from '../../../../src-migrate/modules/register/stores/usePengajuanTempoStore'; import { toast } from 'react-hot-toast'; import useDevice from '@/core/hooks/useDevice'; const Pengiriman = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { const { control, watch, setValue } = useForm(); const { isDesktop, isMobile } = useDevice(); const { formPengiriman, errorsPengiriman, validatePengiriman, updateFormPengiriman, } = usePengajuanTempoStorePengiriman(); const { form, errors, validate, updateForm } = usePengajuanTempoStore(); const [states, setState] = useState([]); const [cities, setCities] = useState([]); const [sameAddress, setSameAddress] = useState(false); const [sameAddressStreet, setSameAddressStreet] = useState(false); const [everyWeekday, setEveryWeekday] = useState(false); const [everyWeek, setEveryWeek] = useState(false); const [tukarInvoice, setTukarInvoice] = useState(false); const [everyWeekdayPembayaran, setEveryWeekdayPembayaran] = useState(false); const [everyWeekPembayaran, setEveryWeekPembayaran] = useState(false); const [tukarInvoicePembayaran, setTukarInvoicePembayaran] = useState(false); const [selectedRadio, setSelectedRadio] = useState(''); const [selectedRadioInvoice, setSelectedRadioInvoice] = useState(''); const [selectedIds, setSelectedIds] = useState( formPengiriman.dokumenPengiriman ? formPengiriman.dokumenPengiriman.split(',').map(Number) : [] ); const [selectedIdsDokumenInvoice, setSelectedIdsselectedIdsDokumenInvoice] = useState( formPengiriman.dokumenPengirimanInvoice ? formPengiriman.dokumenPengirimanInvoice.split(',').map(Number) : [] ); const handleCheckboxChange = (id) => { const updatedSelected = selectedIds.includes(id) ? selectedIds.filter((selectedId) => selectedId !== id) : [...selectedIds, id]; setSelectedIds(updatedSelected); // Jika checkbox 'Lainnya' dipilih, aktifkan input custom updateFormPengiriman('dokumenPengiriman', updatedSelected.join(',')); validatePengiriman(); }; const handleCheckboxChangeDokumenPengirimanInvoice = (id) => { const updatedSelected = selectedIdsDokumenInvoice.includes(id) ? selectedIdsDokumenInvoice.filter((selectedId) => selectedId !== id) : [...selectedIdsDokumenInvoice, id]; setSelectedIdsselectedIdsDokumenInvoice(updatedSelected); // Jika checkbox 'Lainnya' dipilih, aktifkan input custom updateFormPengiriman('dokumenPengirimanInvoice', updatedSelected.join(',')); validatePengiriman(); }; useEffect(() => { if (formPengiriman.dokumenPengiriman) { setSelectedIds(formPengiriman.dokumenPengiriman.split(',').map(Number)); // Parse string menjadi array angka } }, [formPengiriman.dokumenPengiriman]); useEffect(() => { if (formPengiriman.dokumenPengirimanInvoice) { setSelectedIdsselectedIdsDokumenInvoice( formPengiriman.dokumenPengirimanInvoice.split(',').map(Number) ); // Parse string menjadi array angka } }, [formPengiriman.dokumenPengirimanInvoice]); // Fungsi untuk memeriksa apakah item sudah dipilih const isChecked = (id) => selectedIds.includes(id); const isCheckedInvoice = (id) => selectedIdsDokumenInvoice.includes(id); useEffect(() => { const loadState = async () => { let dataState = await stateApi(); dataState = dataState.map((state) => ({ value: state.id, label: state.name, })); setState(dataState); }; loadState(); }, []); const watchState = watch('statePengiriman'); useEffect(() => { // updateFormPengiriman('cityPengiriman', ''); if (watchState) { updateFormPengiriman('statePengiriman', `${watchState}`); validatePengiriman(); 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('cityPengiriman'); useEffect(() => { if (watchCity) { updateFormPengiriman('cityPengiriman', `${watchCity}`); validatePengiriman(); } }, [watchCity]); const handleInputChange = (event) => { const { name, value } = event.target; updateFormPengiriman(name, value); validatePengiriman(); }; const handleRadioChange = (value) => { setSelectedRadio(value); if (value == 'everyWeekday') { setEveryWeekday(!everyWeekday); } else if (value == 'everyWeek') { setEveryWeek(!everyWeek); } else { setTukarInvoice(!tukarInvoice); } validatePengiriman(); }; const handleRadioChangeInvoice = (value) => { setSelectedRadioInvoice(value); if (value == 'everyWeekdayPembayaran') { setEveryWeekdayPembayaran(!everyWeekdayPembayaran); } else if (value == 'everyWeekPembayaran') { setEveryWeekPembayaran(!everyWeekPembayaran); } else { setTukarInvoicePembayaran(!tukarInvoicePembayaran); } validatePengiriman(); }; const handleEveryWeekday = () => { setEveryWeekday(!everyWeekday); }; const handleEveryWeek = () => { setEveryWeek(!everyWeek); }; const handleTukarInvoice = () => { setTukarInvoice(!tukarInvoice); }; const handleEveryWeekdayPembayaran = () => { setEveryWeekdayPembayaran(!everyWeekdayPembayaran); }; const handleEveryWeekPembayaran = () => { setEveryWeekPembayaran(!everyWeekPembayaran); }; const handleTukarInvoicePembayaran = () => { setTukarInvoicePembayaran(!tukarInvoicePembayaran); }; // useEffect(() => { // updateFormPengiriman('everyWeekday', everyWeekday); // updateFormPengiriman('everyWeek', everyWeek); // updateFormPengiriman('tukarInvoice', tukarInvoice); // updateFormPengiriman('everyWeekdayPembayaran', everyWeekdayPembayaran); // updateFormPengiriman('everyWeekPembayaran', everyWeekPembayaran); // updateFormPengiriman('tukarInvoicePembayaran', tukarInvoicePembayaran); // validatePengiriman(); // }, [ // everyWeekday, // everyWeek, // tukarInvoice, // everyWeekdayPembayaran, // everyWeekPembayaran, // tukarInvoicePembayaran, // ]); const isFormValid = useMemo( () => Object.keys(errorsPengiriman).length === 0, [errorsPengiriman] ); const PICNameRef = useRef(null); const streetPengirimanRef = useRef(null); const statePengirimanRef = useRef(null); const cityPengirimanRef = useRef(null); const zipRef = useRef(null); const invoicePicRef = useRef(null); const streetInvoiceRef = useRef(null); const stateInvoiceRef = useRef(null); const cityInvoiceRef = useRef(null); const everyWeekdayInputRef = useRef(null); const everyWeekInputRef = useRef(null); const dokumenPengirimanRef = useRef(null); const dokumenPengirimanInputRef = useRef(null); const dokumenPengirimanInvoiceRef = useRef(null); const dokumenPengirimanInvoiceInputRef = useRef(null); useEffect(() => { const loadIndustries = async () => { if (!isFormValid) { const options = { behavior: 'smooth', block: 'center', }; if (errorsPengiriman.PICName && PICNameRef.current) { PICNameRef.current.scrollIntoView(options); return; } if (errorsPengiriman.streetPengiriman && streetPengirimanRef.current) { streetPengirimanRef.current.scrollIntoView(options); return; } if (errorsPengiriman.statePengiriman && statePengirimanRef.current) { statePengirimanRef.current.scrollIntoView(options); return; } if (errorsPengiriman.cityPengiriman && cityPengirimanRef.current) { cityPengirimanRef.current.scrollIntoView(options); return; } if (errorsPengiriman.zip && zipRef.current) { zipRef.current.scrollIntoView(options); return; } if (errorsPengiriman.invoicePic && invoicePicRef.current) { invoicePicRef.current.scrollIntoView(options); return; } if (errorsPengiriman.streetInvoice && streetInvoiceRef.current) { streetInvoiceRef.current.scrollIntoView(options); return; } if (errorsPengiriman.stateInvoice && stateInvoiceRef.current) { stateInvoiceRef.current.scrollIntoView(options); return; } if (errorsPengiriman.cityInvoice && cityInvoiceRef.current) { cityInvoiceRef.current.scrollIntoView(options); return; } if ( errorsPengiriman.everyWeekdayInput && everyWeekdayInputRef.current ) { everyWeekdayInputRef.current.scrollIntoView(options); return; } if (errorsPengiriman.everyWeekInput && everyWeekInputRef.current) { everyWeekInputRef.current.scrollIntoView(options); return; } if ( errorsPengiriman.dokumenPengiriman && dokumenPengirimanRef.current ) { dokumenPengirimanRef.current.scrollIntoView(options); return; } if ( errorsPengiriman.dokumenInvoice && dokumenPengirimanInvoiceRef.current ) { dokumenPengirimanInvoiceRef.current.scrollIntoView(options); return; } if ( selectedIds && formPengiriman.dokumenPengirimanInput === '' && dokumenPengirimanInputRef.current ) { dokumenPengirimanInputRef.current.scrollIntoView(options); return; } if ( selectedIdsDokumenInvoice && formPengiriman.dokumenPengirimanInvoiceInput === '' && dokumenPengirimanInvoiceInputRef.current ) { dokumenPengirimanInvoiceInputRef.current.scrollIntoView(options); return; } } }; loadIndustries(); }, [buttonSubmitClick, chekValid]); useEffect(() => { if (formPengiriman.isSameAddreesStreet == 'true') { setSameAddressStreet(true); } }, [formPengiriman.isSameAddreesStreet]); useEffect(() => { if (formPengiriman.isSameAddrees == 'true') { setSameAddress(true); } }, [formPengiriman.isSameAddrees]); // useEffect(() => { // validatePengiriman(); // if (formPengiriman.isSameAddrees) { // const isSame = formPengiriman.isSameAddrees; // if (isSame == 'true') { // setSameAddress(true); // } else { // setSameAddress(false); // } // } // if (formPengiriman.isSameAddreesStreet) { // const isSame = formPengiriman.isSameAddreesStreet; // if (isSame == 'true') { // setSameAddressStreet(true); // } else { // setSameAddressStreet(false); // } // } // validatePengiriman(); // }, [buttonSubmitClick]); // useEffect(() => { // if (formPengiriman.isSameAddrees) { // const isSame = formPengiriman.isSameAddrees; // if (isSame == 'true') { // setSameAddress(true); // } else { // setSameAddress(false); // } // } // if (formPengiriman.isSameAddreesStreet) { // const isSame = formPengiriman.isSameAddreesStreet; // if (isSame == 'true') { // setSameAddressStreet(true); // } else { // setSameAddressStreet(false); // } // } // validatePengiriman(); // }, [formPengiriman.isSameAddrees, formPengiriman.isSameAddreesStreet]); useEffect(() => { if (sameAddress) { updateFormPengiriman('streetInvoice', formPengiriman.streetPengiriman); updateFormPengiriman('stateInvoice', formPengiriman.statePengiriman); setValue('stateInvoice', parseInt(formPengiriman.statePengiriman)); updateFormPengiriman('cityInvoice', formPengiriman.cityPengiriman); setValue('cityInvoice', parseInt(formPengiriman.cityPengiriman)); updateFormPengiriman('isSameAddrees', `${sameAddress}`); } else { // updateFormPengiriman('streetInvoice', ''); // updateFormPengiriman('stateInvoice', ''); // updateFormPengiriman('cityInvoice', ''); // setValue('streetInvoice', ''); // setValue('stateInvoice', ''); // setValue('cityInvoice', ''); } validatePengiriman(); }, [ sameAddress, formPengiriman.streetPengiriman, formPengiriman.statePengiriman, formPengiriman.cityPengiriman, ]); useEffect(() => { if (formPengiriman.sameAddressStreet?.toLowerCase().includes('true')) { setSameAddressStreet(true); } else { setSameAddressStreet(false); } }, [formPengiriman.sameAddressStreet]); useEffect(() => { if (formPengiriman.statePengiriman) { setValue('statePengiriman', parseInt(formPengiriman.statePengiriman)); } }, [formPengiriman.statePengiriman]); useEffect(() => { if (formPengiriman.cityPengiriman) { setValue('cityPengiriman', parseInt(formPengiriman.cityPengiriman)); } }, [formPengiriman.cityPengiriman]); useEffect(() => { if (sameAddressStreet) { console.log('form.state', form); updateFormPengiriman('streetPengiriman', form.street); updateFormPengiriman('statePengiriman', form.state); setValue('statePengiriman', parseInt(form.state)); updateFormPengiriman('cityPengiriman', form.city); setValue('cityPengiriman', parseInt(form.city)); updateFormPengiriman('zipPengiriman', form.zip); updateFormPengiriman('isSameAddreesStreet', `${sameAddressStreet}`); } // else { // updateFormPengiriman('streetPengiriman', ''); // updateFormPengiriman('statePengiriman', ''); // updateFormPengiriman('cityPengiriman', ''); // updateFormPengiriman('zipPengiriman', ''); // setValue('streetPengiriman', ''); // setValue('statePengiriman', ''); // setValue('cityPengiriman', ''); // } validatePengiriman(); }, [sameAddressStreet]); const getFromLocalStorage = (key) => { const itemStr = localStorage.getItem(key); if (!itemStr) return null; const item = JSON.parse(itemStr); return item; }; // const cachedData = getFromLocalStorage('Pengiriman'); // useEffect(() => { // if (cachedData) { // setValue('cityPengiriman', parseInt(cachedData?.cityPengiriman)); // updateFormPengiriman('cityPengiriman', `${cachedData?.cityPengiriman}`); // } // if (cachedData?.statePengiriman) { // setValue('statePengiriman', parseInt(cachedData?.statePengiriman)); // } // if (cachedData?.stateInvoice) { // setValue('stateInvoice', parseInt(cachedData?.stateInvoice)); // } // if (cachedData?.cityInvoice) { // setValue('cityInvoice', parseInt(cachedData?.cityInvoice)); // } // if (cachedData?.isSameAddrees) { // updateFormPengiriman('isSameAddrees', `${cachedData?.isSameAddrees}`); // } // validatePengiriman(); // }, [cachedData?.cityPengiriman]); // useEffect(() => { // if (cachedData?.everyWeek) { // updateFormPengiriman('everyWeek', cachedData?.everyWeek); // setEveryWeek(cachedData?.everyWeek); // } // if (cachedData?.everyWeekday) { // updateFormPengiriman('everyWeekday', cachedData?.everyWeekday); // setEveryWeekday(cachedData?.everyWeekday); // } // if (cachedData?.tukarInvoice) { // updateFormPengiriman('tukarInvoice', cachedData?.tukarInvoice); // setTukarInvoice(cachedData?.tukarInvoice); // } // if (cachedData?.everyWeekPembayaran) { // updateFormPengiriman( // 'everyWeekPembayaran', // cachedData?.everyWeekPembayaran // ); // setEveryWeekPembayaran(cachedData?.everyWeekPembayaran); // } // if (cachedData?.everyWeekdayPembayaran) { // updateFormPengiriman( // 'everyWeekdayPembayaran', // cachedData?.everyWeekdayPembayaran // ); // setEveryWeekdayPembayaran(cachedData?.everyWeekdayPembayaran); // } // if (cachedData?.tukarInvoicePembayaran) { // updateFormPengiriman( // 'tukarInvoicePembayaran', // cachedData?.tukarInvoicePembayaran // ); // setTukarInvoicePembayaran(cachedData?.tukarInvoicePembayaran); // } // validatePengiriman(); // }, [ // cachedData?.everyWeek, // cachedData?.everyWeekday, // cachedData?.tukarInvoice, // cachedData?.everyWeekdayPembayaran, // cachedData?.everyWeekPembayaran, // cachedData?.tukarInvoicePembayaran, // ]); const handleChangeSameAddress = () => { setSameAddress(!sameAddress); }; const handleChangeSameAddressStreet = () => { // updateFormPengiriman('sameAddressStreet', `${!sameAddressStreet}`); setSameAddressStreet(!sameAddressStreet); if (sameAddressStreet == false) { updateFormPengiriman('streetPengiriman', ''); updateFormPengiriman('statePengiriman', ''); updateFormPengiriman('cityPengiriman', ''); updateFormPengiriman('zipPengiriman', ''); setValue('streetPengiriman', ''); setValue('statePengiriman', ''); setValue('cityPengiriman', ''); updateFormPengiriman('isSameAddreesStreet', `${sameAddressStreet}`); validate(); } }; useEffect(() => { const options = { behavior: 'smooth', block: 'center', }; const loadIndustries = async () => { const watchZip = formPengiriman.zipPengiriman?.trim(); // Menghapus spasi berlebih // Validasi: hanya eksekusi jika watchZip valid (contoh: minimal 5 karakter) if (watchZip && watchZip.length >= 5) { const loadZip = async () => { try { const response = await fetch( `https://alamat.thecloudalert.com/api/cari/index/?keyword=${watchZip}` ); const result = await response.json(); if (!result.result.length > 0) { toast.error('Alamat pos salah'); updateFormPengiriman('zipPengiriman', ''); // Reset form.zip jika salah validate(); // Memanggil validasi formulir return false; } else { updateFormPengiriman('zipPengiriman', watchZip); validate(); return true; // Jika valid } } catch (error) { toast.error('Terjadi kesalahan saat memeriksa alamat pos.'); console.error('Error:', error); return false; } }; const isValidZip = await loadZip(); if (!isValidZip) { zipRef.current.scrollIntoView(options); } } }; loadIndustries(); }, [formPengiriman.zipPengiriman]); console.log('formPengiriman', formPengiriman); console.log('errorsPengiriman', errorsPengiriman); return ( <> {isDesktop && (