import React, { useContext, useEffect, useState } from "react"; import { Box, Button, FormControl, FormLabel, Input, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Text, useToast, } from "@chakra-ui/react"; import { Controller, useForm } from "react-hook-form"; import * as yup from "yup"; import { yupResolver } from "@hookform/resolvers/yup"; import GlobalStateContext from "../../../../Contexts/GlobalStateContext"; import { useParams } from "react-router-dom"; import { useAmountIvestmentMutation } from "../../../../Services/io.service"; import ToastBox from "../../../../Components/ToastBox"; import CurrencyInput from "../../../../Components/CurrencyInput"; // Validation schema const validationSchema = yup.object().shape({ transactionDate: yup.date().required("Date is required"), Total_Amount: yup.number().required("Amount is required"), amountInvested: yup.number().required("Amount to invest is required"), IoCash: yup.number().positive("IO Cash must be positive").required("IO Cash is required"), }); // Function to format currency const formatCurrency = (value) => { if (isNaN(value)) return ""; const formatted = parseFloat(value).toFixed(2).toString(); const [integer, decimal] = formatted.split("."); const formattedInteger = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ","); return decimal ? `${formattedInteger}.${decimal}` : formattedInteger; }; const AmountInvested = ({ isOpen, onClose }) => { const params = useParams(); const toast = useToast(); const id = params?.id; const { control, register, handleSubmit, reset, watch, formState: { errors }, } = useForm({ resolver: yupResolver(validationSchema), }); const [isLoading, setIsLoading] = useState(false); const { IODetails } = useContext(GlobalStateContext); const [amountInvested] = useAmountIvestmentMutation(); useEffect(() => { if (IODetails?.totalAmtInvestmentInUSD) { const totalAmount = parseFloat(IODetails.totalAmtInvestmentInUSD); const ioCashUpdate = parseFloat(IODetails.totalAmtInvestmentInUSD); reset({ Total_Amount: totalAmount, IoCash: ioCashUpdate, }); } }, [IODetails, reset]); const onSubmit = async (data) => { console.log(data); setIsLoading(true); try { const res = await amountInvested({ data, id }); console.log(res); if (res?.data?.statusCode === 200) { toast({ render: () => , }); setIsLoading(false); onClose(); } else if (res?.error?.status === 400) { toast({ render: () => ( ), }); setIsLoading(false); } } catch (error) { setIsLoading(false); } }; const handleAmountChange = (e) => { // e might be an object or just a value, handle both cases const amount = typeof e === "object" && e.target ? parseFloat(e.target.value) || 0 : parseFloat(e) || 0; const totalAmount = parseFloat(IODetails?.totalAmtInvestmentInUSD) || 0; const ioCash = (totalAmount - amount).toFixed(2); reset({ amountInvested: parseFloat(amount), IoCash: parseFloat(ioCash), Total_Amount: IODetails?.totalAmtInvestmentInUSD, }); }; const handleModalClose = () => { reset({ transactionDate: "", Total_Amount: IODetails?.totalAmtInvestmentInUSD || 0, amountInvested: 0, IoCash: IODetails?.totalAmtInvestmentInUSD || 0, }); onClose(); }; return ( Amount Invested
Date {errors.transactionDate && ( {errors.transactionDate.message} )} Amount {errors.Total_Amount && ( {errors.Total_Amount.message} )} Amount to invest {/* */} ( { field.onChange(value); // This will keep the form's internal state updated handleAmountChange(value); // This will trigger your custom logic }} /> )} /> {errors.amountInvested && ( {errors.amountInvested.message} )} IO Cash {errors.IoCash && ( {errors.IoCash.message} )}
); }; export default AmountInvested;