265 lines
7.6 KiB
JavaScript
265 lines
7.6 KiB
JavaScript
import {
|
||
Box,
|
||
Button,
|
||
Drawer,
|
||
DrawerBody,
|
||
DrawerCloseButton,
|
||
DrawerContent,
|
||
DrawerFooter,
|
||
DrawerHeader,
|
||
DrawerOverlay,
|
||
FormControl,
|
||
FormErrorMessage,
|
||
FormLabel,
|
||
HStack,
|
||
Input,
|
||
Select,
|
||
Stack,
|
||
Text,
|
||
Textarea,
|
||
VStack,
|
||
useToast,
|
||
} from "@chakra-ui/react";
|
||
import * as yup from "yup";
|
||
import React, { useState, useEffect, useContext } from "react";
|
||
import { useForm, Controller } from "react-hook-form";
|
||
import { yupResolver } from "@hookform/resolvers/yup";
|
||
import CustomAlertDialog from "../../../Components/CustomAlertDialog";
|
||
import { v4 as uuidv4 } from "uuid";
|
||
import { useCreateIoCashMutation, useCreateIoNavMutation, useCreateVideoArtifactsMutation, useUpdateVideoArtifactsMutation } from "../../../Services/io.service";
|
||
import { useParams } from "react-router-dom";
|
||
import ToastBox from "../../../Components/ToastBox";
|
||
import GlobalStateContext from "../../../Contexts/GlobalStateContext";
|
||
import CurrencyInput from "../../../Components/CurrencyInput";
|
||
import { formatDatee } from "../../../Components/FormField";
|
||
|
||
const ioNav = yup.object().shape({
|
||
transactionDate: yup.string().required("Date is required"),
|
||
transactionAmount: yup.number().required("New NAV is required"),
|
||
comments: yup.string().notRequired(),
|
||
});
|
||
|
||
const AddIONav = ({ isOpen, onClose, firstField, actionId, setActionId, data }) => {
|
||
const params = useParams()
|
||
const id = params?.id
|
||
const [file, setFile] = useState("");
|
||
const [fileName, setFileName] = useState("");
|
||
const [isLoading, setIsLoading] = useState(false)
|
||
const [alert, setAlert] = useState(false);
|
||
const toast = useToast();
|
||
|
||
|
||
|
||
// ======================[ Cotext Api ]
|
||
const { IODetails } = useContext(GlobalStateContext);
|
||
const found = data?.find((item) => item?.id === actionId);
|
||
|
||
|
||
const [createIoNav] = useCreateIoNavMutation()
|
||
// const {
|
||
// data
|
||
// } = useGetArtifactsQuery(id)
|
||
|
||
const {
|
||
control,
|
||
handleSubmit,
|
||
watch,
|
||
reset,
|
||
formState: { errors },
|
||
} = useForm({
|
||
resolver: yupResolver(ioNav),
|
||
});
|
||
|
||
|
||
const [createIoCash] = useCreateIoCashMutation()
|
||
|
||
|
||
const onSubmit = async (data) => {
|
||
|
||
setIsLoading(true)
|
||
|
||
try {
|
||
|
||
const res = await createIoNav({ data, id })
|
||
if (res?.data?.statusCode === 201) {
|
||
setIsLoading(false);
|
||
toast({
|
||
render: () => <ToastBox message={res?.data?.message} />,
|
||
});
|
||
handleClose()
|
||
}else if(res?.error?.status === 400){
|
||
toast({
|
||
render: () => <ToastBox message={res?.error?.data?.message } status={"error"} />,
|
||
});
|
||
handleClose()
|
||
}
|
||
|
||
|
||
} catch (error) {
|
||
console.log(error);
|
||
|
||
}
|
||
|
||
};
|
||
|
||
|
||
|
||
const handleConfirm = () => {
|
||
handleSubmit(onSubmit)();
|
||
};
|
||
|
||
const handleSave = () => {
|
||
handleSubmit(onSubmit)();
|
||
};
|
||
|
||
const handleClose = () => {
|
||
setIsLoading(false);
|
||
setAlert(false)
|
||
onClose()
|
||
reset({
|
||
transactionDate:"",
|
||
transactionAmount:"",
|
||
comments:""
|
||
})
|
||
}
|
||
|
||
|
||
|
||
|
||
const today = formatDatee(new Date(), 'yyyy-MM-dd');
|
||
|
||
function calculatePercentage(newNav, currNav) {
|
||
const per = (newNav - currNav) / currNav * 100
|
||
return per.toFixed(2)
|
||
}
|
||
|
||
|
||
console.log(calculatePercentage(1092500, 976070));
|
||
|
||
|
||
|
||
return (
|
||
<>
|
||
<Drawer
|
||
size={"md"}
|
||
isOpen={isOpen}
|
||
placement="right"
|
||
initialFocusRef={firstField}
|
||
onClose={handleClose}
|
||
>
|
||
<DrawerOverlay />
|
||
<DrawerContent>
|
||
<DrawerCloseButton />
|
||
<DrawerHeader fontSize={"sm"}>IO Nav Details</DrawerHeader>
|
||
|
||
<DrawerBody>
|
||
<Stack spacing={4}>
|
||
<FormControl isInvalid={errors.transactionDate} isRequired>
|
||
<FormLabel fontSize={"sm"}>Date Selection</FormLabel>
|
||
<Controller
|
||
name="transactionDate"
|
||
control={control}
|
||
render={({ field }) => (
|
||
<Input {...field}
|
||
max={today} // Set max attribute to today’s date
|
||
fontSize={"sm"} type="date" size={"sm"} />
|
||
)}
|
||
/>
|
||
<FormErrorMessage fontSize={"xs"} fontWeight={500}>
|
||
{errors.transactionDate?.message}
|
||
</FormErrorMessage>
|
||
</FormControl>
|
||
|
||
|
||
|
||
<FormControl isInvalid={errors.transactionAmount} isRequired>
|
||
<FormLabel fontSize={"sm"}>New NAV</FormLabel>
|
||
<Controller
|
||
name="transactionAmount"
|
||
control={control}
|
||
render={({ field }) => (
|
||
<CurrencyInput {...field} textAlign={'right'} fontSize={"sm"} type="number" size={"sm"} />
|
||
)}
|
||
/>
|
||
<FormErrorMessage fontSize={"xs"} fontWeight={500}>
|
||
{errors.transactionAmount?.message}
|
||
</FormErrorMessage>
|
||
</FormControl>
|
||
|
||
|
||
<HStack justify={'start'} gap={10} bg={'green.100'} p={3} rounded={'md'} shadow={'md'}>
|
||
<VStack align={'start'}>
|
||
<Text as={'span'} fontSize={'sm'} fontWeight={500}>Current nav</Text>
|
||
<Text as={'span'} fontSize={'sm'}>
|
||
{parseFloat(IODetails?.ioNAV || 0).toLocaleString(undefined, {
|
||
minimumFractionDigits: 2,
|
||
maximumFractionDigits: 2,
|
||
})}
|
||
</Text>
|
||
</VStack>
|
||
|
||
|
||
<VStack align={'start'}>
|
||
<Text as={'span'} fontSize={'sm'} fontWeight={500}>Live return %</Text>
|
||
<Text as={'span'} fontSize={'sm'}>{calculatePercentage(watch()?.transactionAmount||IODetails?.ioNAV,IODetails?.ioNAV)}</Text>
|
||
</VStack>
|
||
</HStack>
|
||
|
||
|
||
|
||
<FormControl isInvalid={errors.comments}>
|
||
<FormLabel fontSize={"sm"}>Comments</FormLabel>
|
||
<Controller
|
||
name="comments"
|
||
control={control}
|
||
render={({ field }) => (
|
||
<Textarea {...field} fontSize={"sm"} type="text" size={"sm"} />
|
||
)}
|
||
/>
|
||
<FormErrorMessage fontSize={"xs"} fontWeight={500}>
|
||
{errors.comments?.message}
|
||
</FormErrorMessage>
|
||
</FormControl>
|
||
|
||
</Stack>
|
||
</DrawerBody>
|
||
|
||
<DrawerFooter>
|
||
<Button
|
||
variant="outline"
|
||
colorScheme={"forestGreen"}
|
||
rounded={"sm"}
|
||
size={"sm"}
|
||
mr={3}
|
||
onClick={handleClose}
|
||
>
|
||
Cancel
|
||
</Button>
|
||
|
||
<Button
|
||
colorScheme={"forestGreen"}
|
||
rounded={"sm"}
|
||
size={"sm"}
|
||
|
||
onClick={() => setAlert(true)}
|
||
>
|
||
Save
|
||
</Button>
|
||
</DrawerFooter>
|
||
</DrawerContent>
|
||
</Drawer>
|
||
|
||
|
||
<CustomAlertDialog
|
||
isOpen={alert}
|
||
onClose={() => setAlert(false)}
|
||
alertHandler={handleSave}
|
||
message={"Are you sure you want to add NAV details?"}
|
||
isLoading={isLoading}
|
||
/>
|
||
</>
|
||
);
|
||
};
|
||
|
||
export default AddIONav;
|
||
|