import HookFormSelect from '@/core/components/elements/Select/HookFormSelect'; import cityApi from '@/lib/address/api/cityApi'; import stateApi from '@/lib/address/api/stateApi.js'; import districtApi from '@/lib/address/api/districtApi'; import subDistrictApi from '@/lib/address/api/subDistrictApi'; import { yupResolver } from '@hookform/resolvers/yup'; import React, { useEffect, useRef, useState, forwardRef, useImperativeHandle, } from 'react'; import ReCAPTCHA from 'react-google-recaptcha'; import { Controller, useForm } from 'react-hook-form'; import { toast } from 'react-hot-toast'; import * as Yup from 'yup'; import createMerchantApi from '../api/createMerchantApi'; import getMerchantApi from '../api/getMerchantApi'; import addressApi from '@/lib/address/api/addressApi'; import PageContent from '@/lib/content/components/PageContent'; import { useRouter } from 'next/router'; import useAuth from '@/core/hooks/useAuth'; import { Radio, RadioGroup, Stack, Divider, Button } from '@chakra-ui/react'; import { EyeIcon } from '@heroicons/react/24/outline'; import BottomPopup from '@/core/components/elements/Popup/BottomPopup'; import Image from 'next/image'; import ImageBanner from '~/components/ui/image'; import { ChevronRightIcon } from '@heroicons/react/24/outline'; import MobileView from '@/core/components/views/MobileView'; import DesktopView from '@/core/components/views/DesktopView'; import getFileBase64 from '@/core/utils/getFileBase64'; import odooApi from '~/libs/odooApi'; const Dokumen = forwardRef( ({ handleIsError, isKonfirmasi, buttonSubmitClick }, ref) => { const isError = (value) => { // Logika menentukan error const result = value ? true : false; handleIsError(result); // Panggil handleIsError dari Merchant return result; }; const { register, handleSubmit, formState: { errors }, control, reset, watch, setValue, getValues, } = useForm({ resolver: yupResolver(validationSchema), defaultValues, }); const list_unit = [ { value: 'Manufacturing', label: 'Manufacturing', }, { value: 'Hospitality', label: 'Hospitality', }, { value: 'Automotive', label: 'Automotive', }, { value: 'Retail', label: 'Retail', }, { value: 'Maining', label: 'Maining', }, { value: 'Lain - Lain', label: 'Lain - Lain', }, ]; const [fileNames, setFileNames] = useState({}); const [DeatailFile, setDetailFile] = useState({}); const [isExample, setIsExample] = useState(false); const [isPkp, setIsPkp] = useState(false); const npwpRef = useRef(null); const sppkpRef = useRef(null); const ktpDirutRef = useRef(null); const kartuNamaRef = useRef(null); const suratPernyataanRef = useRef(null); const fotoKantorRef = useRef(null); const dataProdukRef = useRef(null); const pricelistRef = useRef(null); const router = useRouter(); const auth = useAuth(); if (auth == false) { router.push(`/login?next=${encodeURIComponent('/daftar-merchant')}`); } useEffect(() => { const loadData = async () => { try { const data = await getMerchantApi(); if (data) { setFileNames((prev) => ({ ...prev, ['npwp']: data.fileNpwp ? data.fileNpwp.name : '', ['sppkp']: data.fileSppkp ? data.fileSppkp.name : '', ['dokumenKtpDirut']: data.fileDokumenKtpDirut ? data.fileDokumenKtpDirut.name : '', ['kartuNama']: data.fileKartuNama ? data.fileKartuNama.name : '', ['suratPernyataan']: data.fileSuratPernyataan ? data.fileSuratPernyataan.name : '', ['fotoKantor']: data.fileFotoKantor ? data.fileFotoKantor.name : '', ['dataProduk']: data.fileDataProduk ? data.fileDataProduk.name : '', ['pricelist']: data.filePricelist ? data.filePricelist.name : '', })); } } catch (error) { console.error('Error loading profile:', error); handleIsError(true); // Jika ada error, panggil fungsi error handler } }; loadData(); }, [reset, handleIsError]); useEffect(() => { if (!isKonfirmasi) { window.scrollTo({ top: 0, behavior: 'smooth', }); } }, []); useImperativeHandle(ref, () => () => { handleSubmit(onSubmitHandler)(); }); useEffect(() => { const loadProfile = async () => { try { const dataProfile = await addressApi({ id: auth.parentId ? auth.parentId : auth.partnerId, }); if (dataProfile.companyType == 'pkp') { setIsPkp(true); } setValue('company', dataProfile?.name); setValue('address', dataProfile?.alamatBisnis); setValue('state', parseInt(dataProfile.stateId.id)); setValue('city', parseInt(dataProfile.city.id)); setValue('district', parseInt(dataProfile.district.id)); setValue('subDistrict', parseInt(dataProfile.subDistrict.id)); setValue('zip', parseInt(dataProfile.zip)); } catch (error) { console.error('Error loading profile:', error); } }; loadProfile(); }, [auth?.parentId]); const onSubmitHandler = async (values) => { const options = { behavior: 'smooth', block: 'center', }; const npwp = { name: fileNames.npwp, format: DeatailFile.npwp }; const sppkp = { name: fileNames.sppkp, format: DeatailFile.sppkp }; const dokumenKtpDirut = { name: fileNames.dokumenKtpDirut, format: DeatailFile.dokumenKtpDirut, }; const kartuNama = { name: fileNames.kartuNama, format: DeatailFile.kartuNama, }; const suratPernyataan = { name: fileNames.suratPernyataan, format: DeatailFile.suratPernyataan, }; const fotoKantor = { name: fileNames.fotoKantor, format: DeatailFile.fotoKantor, }; const dataProduk = { name: fileNames.dataProduk, format: DeatailFile.dataProduk, }; const pricelist = { name: fileNames.pricelist, format: DeatailFile.pricelist, }; if (!npwp.name && isPkp) { if (npwpRef?.current) { npwpRef.current.scrollIntoView(options); } toast.error('NPWP wajib di tambahkan'); return; } if (!sppkp.name && isPkp) { toast.error('SPPKP wajib di tambahkan'); if (sppkpRef?.current) { sppkpRef.current.scrollIntoView(options); } return; } if (!dokumenKtpDirut.name && !isPkp) { toast.error('KTP Dirut/Direktur wajib di tambahkan'); if (ktpDirutRef?.current) { ktpDirutRef.current.scrollIntoView(options); } return; } if (!fotoKantor.name) { toast.error('Foto Gudang / Kantor Bagian Depan wajib di tambahkan'); if (fotoKantorRef?.current) { fotoKantorRef.current.scrollIntoView(options); } return; } if (!pricelist.name) { toast.error('Pricelist wajib di tambahkan'); if (pricelistRef?.current) { pricelistRef.current.scrollIntoView(options); } return; } const toastId = toast.loading('Mengirimkan formulir merchant...'); const dokumen = { file_npwp: { details: npwp.format ? npwp : '' }, file_sppkp: { details: sppkp.format ? sppkp : '' }, file_dokumenKtpDirut: { details: dokumenKtpDirut.format ? dokumenKtpDirut : '', }, file_kartuNama: { details: kartuNama.format ? kartuNama : '' }, file_suratPernyataan: { details: suratPernyataan.format ? suratPernyataan : '', }, file_fotoKantor: { details: fotoKantor.format ? fotoKantor : '' }, file_dataProduk: { details: dataProduk.format ? dataProduk : '' }, file_pricelist: { details: pricelist.format ? pricelist : '' }, }; let data = { file_dokumen: JSON.stringify(dokumen), }; const create_leads = await createMerchantApi({ data }); if (create_leads) { toast.dismiss(toastId); toast.success('Berhasil menambahkan data'); isError(false); reset(); } else { toast.dismiss(toastId); toast.error('Gagal menambahkan data'); } }; if (!auth) { return; } const handleFileChange = async (event) => { let fileBase64 = ''; const file = event.target.files[0]; if (file.size > 2000000) { // try { // const toastId = toast.loading('mencoba mengompresi file...'); // // Compress image file // const options = { // maxSizeMB: 0.5, // Target size in MB // maxWidthOrHeight: 1920, // Adjust as needed // useWebWorker: true, // }; // const compressedFile = await imageCompression(file, options); // toast.success('berhasil mengompresi file', { duration: 4000 }); // // Convert compressed file to Base64 // fileBase64 = await getFileBase64(compressedFile); // } catch (error) { // toast.error('Gagal mengompresi file', { duration: 4000 }); // } toast.error('Maks file size 2MB', { duration: 4000 }); } else { // Convert file to Base64 fileBase64 = await getFileBase64(file); } const fieldName = event.target.name; // Nama input file setDetailFile((prev) => ({ ...prev, [fieldName]: file ? fileBase64 : '', // Tambahkan atau perbarui file di state })); setFileNames((prev) => ({ ...prev, [fieldName]: file ? file.name : '', // Tambahkan atau perbarui file di state })); }; return ( <> setIsExample(false)} >
Contoh SPPKP

Dokumen

{!isKonfirmasi && ( Pastikan dokumen yang anda upload sudah benar )}
{isKonfirmasi && ( {fileNames.npwp} )} { handleFileChange(e); // Untuk update UI (opsional) }} aria-invalid={errors.npwp?.message} /> {!isKonfirmasi && ( {fileNames.npwp} )}
{!isKonfirmasi && ( Format: pdf, jpeg, jpg, png. max file size 2MB )}
{errors.npwp?.message}
{!isKonfirmasi && ( Pastikan dokumen yang anda upload sudah benar )}
setIsExample(!isExample)} className={`h-fit ${ !isKonfirmasi && 'mr-8' } rounded text-white p-2 flex flex-row items-center bg-red-500 hover:cursor-pointer hover:bg-red-400`} > {!isKonfirmasi && (

Lihat Contoh

)}
{isKonfirmasi && ( {fileNames.sppkp} )}
{!isKonfirmasi && ( Format: pdf, jpeg, jpg, png. max file size 2MB )}
{errors.sppkp?.message}
{!isKonfirmasi && ( Pastikan dokumen yang anda upload sudah benar )}
{isKonfirmasi && ( {fileNames.dokumenKtpDirut} )} {!isKonfirmasi && ( {fileNames.dokumenKtpDirut} )}
{!isKonfirmasi && ( Format: pdf, jpeg, jpg, png. max file size 2MB )}
{errors.dokumenKtpDirut?.message}
{!isKonfirmasi && ( Pastikan dokumen yang anda upload sudah benar )}
{isKonfirmasi && ( {fileNames.kartuNama} )} {!isKonfirmasi && ( {fileNames.kartuNama} )}
{!isKonfirmasi && ( Format: pdf, jpeg, jpg, png. max file size 2MB )}
{errors.kartuNama?.message}
{!isKonfirmasi && ( Wajib diisi jika nomor rekening berbeda dengan nama perusahaan )}

Download Template

{isKonfirmasi && ( {fileNames.suratPernyataan} )} {!isKonfirmasi && ( {fileNames.suratPernyataan} )}
{!isKonfirmasi && ( Format: pdf, jpeg, jpg, png. max file size 2MB )}
{errors.suratPernyataan?.message}
{!isKonfirmasi && ( Pastikan dokumen yang anda upload sudah benar )}
{isKonfirmasi && ( {fileNames.fotoKantor} )} {!isKonfirmasi && ( {fileNames.fotoKantor} )}
{!isKonfirmasi && ( Format: pdf, jpeg, jpg, png. max file size 2MB )}
{errors.fotoKantor?.message}
{!isKonfirmasi && ( Pastikan dokumen yang anda upload sudah benar )}
{isKonfirmasi && ( {fileNames.dataProduk} )} {!isKonfirmasi && ( {fileNames.dataProduk} )}
{!isKonfirmasi && ( Format: pdf, jpeg, jpg, png. max file size 2MB )}
{errors.dataProduk?.message}
{!isKonfirmasi && ( Pastikan dokumen yang anda upload sudah benar )}
{isKonfirmasi && ( {fileNames.pricelist} )} {!isKonfirmasi && ( {fileNames.pricelist} )}
{!isKonfirmasi && ( Format: pdf, jpeg, jpg, png. max file size 2MB )}
{errors.pricelist?.message}
{/*
*/}
{/* */} {!isKonfirmasi && (
*Pastikan data yang anda masukan sudah benar dan sesuai
)}
{!isKonfirmasi && (

Dokumen

)}
{ handleFileChange(e); // Untuk update UI (opsional) }} aria-invalid={errors.npwp?.message} /> {fileNames.npwp}
Format: pdf, jpeg, jpg, png. max file size 2MB
{errors.npwp?.message}
setIsExample(!isExample)} className='h-fit rounded text-white p-2 flex flex-row items-center bg-red-500 hover:cursor-pointer hover:bg-red-400' >

Lihat Contoh

{fileNames.sppkp}
Format: pdf, jpeg, jpg, png. max file size 2MB
{errors.sppkp?.message}
{fileNames.dokumenKtpDirut}
Format: pdf, jpeg, jpg, png. max file size 2MB
{errors.dokumenKtpDirut?.message}
{fileNames.kartuNama}
Format: pdf, jpeg, jpg, png. max file size 2MB
{errors.kartuNama?.message}

Download Template

{fileNames.suratPernyataan}
Format: pdf, jpeg, jpg, png. max file size 2MB
{errors.suratPernyataan?.message}
{fileNames.fotoKantor}
Format: pdf, jpeg, jpg, png. max file size 2MB
{errors.fotoKantor?.message}
{fileNames.dataProduk}
Format: pdf, jpeg, jpg, png. max file size 2MB
{errors.fotoKantor?.message}
{fileNames.pricelist}
Format: pdf, jpeg, jpg, png. max file size 2MB
{errors.pricelist?.message}
{/*
*/}
{/* */} {!isKonfirmasi && (
*Pastikan data yang anda masukan sudah benar dan sesuai
)}
); } ); const validationSchema = Yup.object().shape({ npwp: Yup.mixed().required('File is required'), pricelist: Yup.mixed().required('File is required'), }); const defaultValues = { company: '', pejabatName: '', PICName: '', PICPosition: '', email: '', emailSales: '', emailFinance: '', phone: '', state: '', city: '', district: '', subDistrict: '', zip: '', bank: '', rekening: '', accountNumber: '', address: '', mobile: '', }; export default Dokumen;