import { BaseBox, ButtonCenteredOnly, ButtonCustom, CenterCustom, InformationBox, LandscapeFrameUploaded, LoaderCustom, SelectCustom, Spacing, StackCustom, TextCustom, TextInputCustom, ViewWrapper, } from "@/components"; import { MainColor } from "@/constants/color-palet"; import DIRECTORY_ID from "@/constants/directory-id"; import { useAuth } from "@/hooks/use-auth"; import { apiInvestmentCreate } from "@/service/api-client/api-investment"; import { apiMasterInvestment } from "@/service/api-client/api-master"; import { uploadFileService } from "@/service/upload-service"; import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay"; import pickFile, { IFileData } from "@/utils/pickFile"; import { FontAwesome5 } from "@expo/vector-icons"; import { router, useFocusEffect } from "expo-router"; import _ from "lodash"; import { useCallback, useState } from "react"; import Toast from "react-native-toast-message"; export default function InvestmentCreate() { const { user } = useAuth(); const [data, setData] = useState({ title: "", targetDana: "", hargaPerLembar: "", totalLembar: "", rasioKeuntungan: "", pencarianInvestor: "", periodeDeviden: "", pembagianDeviden: "", authorId: "", imageId: "", prospektusFileId: "", }); const [image, setImage] = useState(null); const [pdf, setPdf] = useState(null); const [isLoading, setIsLoading] = useState(false); const [loadingMaster, setLoadingMaster] = useState(false); const [listPencarianInvestor, setListPencarianInvestor] = useState([]); const [listPeriodeDeviden, setListPeriodeDeviden] = useState([]); const [listPembagianDeviden, setListPembagianDeviden] = useState([]); useFocusEffect( useCallback(() => { onLoadMaster(); }, []), ); const onLoadMaster = async () => { try { setLoadingMaster(true); const response = await apiMasterInvestment({ category: "" }); setListPencarianInvestor(response.data.pencarianInvestor); setListPeriodeDeviden(response.data.periodeDeviden); setListPembagianDeviden(response.data.pembagianDeviden); } catch (error) { console.log("[ERROR]", error); } finally { setLoadingMaster(false); } }; const displayTargetDana = formatCurrencyDisplay(data.targetDana); const displayHargaPerLembar = formatCurrencyDisplay(data.hargaPerLembar); const realTotalLembar = Number(data.targetDana) / Number(data.hargaPerLembar); const displayTotalLembar = formatCurrencyDisplay(realTotalLembar); const handleChangeCurrency = (field: keyof typeof data) => (text: string) => { const numeric = text.replace(/\D/g, ""); setData((prev) => ({ ...prev, [field]: numeric })); }; const validateData = () => { if ( !data.title || !data.targetDana || !data.hargaPerLembar || !data.rasioKeuntungan || !data.pencarianInvestor || !data.periodeDeviden || !data.pembagianDeviden ) { Toast.show({ type: "error", text1: "Harap isi semua data", }); return false; } return true; }; const handleSubmit = async () => { if (!validateData()) { return; } if (!image || !pdf) { Toast.show({ type: "error", text1: "Harap upload gambar dan file PDF", }); return; } try { setIsLoading(true); const responseUploadImage = await uploadFileService({ imageUri: image, dirId: DIRECTORY_ID.investasi_image, }); if (!responseUploadImage.success) { Toast.show({ type: "error", text1: "Gagal mengunggah gambar", }); return; } const imageId = responseUploadImage.data.id; const responseUploadPdf = await uploadFileService({ imageUri: pdf.uri, dirId: DIRECTORY_ID.investasi_prospektus, }); if (!responseUploadPdf.success) { Toast.show({ type: "error", text1: "Gagal mengunggah file PDF", }); return; } const pdfId = responseUploadPdf.data.id; const newData = { title: data.title, targetDana: data.targetDana, hargaLembar: data.hargaPerLembar, totalLembar: realTotalLembar.toString(), roi: data.rasioKeuntungan, masterPencarianInvestorId: data.pencarianInvestor, masterPembagianDevidenId: data.pembagianDeviden, masterPeriodeDevidenId: data.periodeDeviden, authorId: user?.id, imageId: imageId, prospektusFileId: pdfId, }; const response = await apiInvestmentCreate({ data: newData }); if (response.success) { Toast.show({ type: "success", text1: "Berhasil", text2: response.message, }); router.replace("/investment/portofolio?status=review"); } else { Toast.show({ type: "error", text1: "Info", text2: response.message, }); } } catch (error) { console.log("error", error); } finally { setIsLoading(false); } }; // const [coba, setCoba] = useState(""); return ( { pickFile({ setImageUri: ({ uri }) => { setImage(uri); }, allowedType: "image", }); }} > Upload {pdf ? ( {pdf.name} ) : ( )} { pickFile({ setPdfUri: ({ uri, name, size }) => { setPdf({ uri, name, size }); }, allowedType: "pdf", }); }} > Upload File setData({ ...data, title: value })} /> *Total lembar dihitung dari, Target Dana / Harga Perlembar setData({ ...data, rasioKeuntungan: value })} value={ data.rasioKeuntungan === "" ? "" : data.rasioKeuntungan.toString() } /> {loadingMaster ? ( ) : ( ({ label: item.name + `${" "}hari`, value: item.id, })) } onChange={(value) => setData({ ...data, pencarianInvestor: value as any }) } value={data.pencarianInvestor} /> )} {loadingMaster ? ( ) : ( ({ label: item.name, value: item.id, })) } onChange={(value) => setData({ ...data, periodeDeviden: value as any }) } value={data.periodeDeviden} /> )} {loadingMaster ? ( ) : ( ({ label: item.name + `${" "}bulan`, value: item.id, })) } onChange={(value) => setData({ ...data, pembagianDeviden: value as any }) } value={data.pembagianDeviden} /> )} handleSubmit()} > Simpan ); }