Merge branch 'dev' of http://git.wdipl.com/Siddhesh.More/tanami-admin-panel into dev
This commit is contained in:
12
src/App.jsx
12
src/App.jsx
@@ -37,12 +37,12 @@ const App = () => {
|
||||
};
|
||||
}, []);
|
||||
|
||||
const PrivateRoute = ({ children }) => {
|
||||
if (!isAuthenticate && isAuthenticatedInCookie !== "true") {
|
||||
return <Navigate to="/login" replace />;
|
||||
}
|
||||
return children;
|
||||
};
|
||||
// const PrivateRoute = ({ children }) => {
|
||||
// if (!isAuthenticate && isAuthenticatedInCookie !== "true") {
|
||||
// return <Navigate to="/login" replace />;
|
||||
// }
|
||||
// return children;
|
||||
// };
|
||||
|
||||
return (
|
||||
<Router>
|
||||
|
||||
243
src/Pages/IO_Management/CreateIO/AddCashDetails.jsx
Normal file
243
src/Pages/IO_Management/CreateIO/AddCashDetails.jsx
Normal file
@@ -0,0 +1,243 @@
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
Drawer,
|
||||
DrawerBody,
|
||||
DrawerCloseButton,
|
||||
DrawerContent,
|
||||
DrawerFooter,
|
||||
DrawerHeader,
|
||||
DrawerOverlay,
|
||||
FormControl,
|
||||
FormErrorMessage,
|
||||
FormLabel,
|
||||
Input,
|
||||
Stack,
|
||||
Textarea,
|
||||
useToast,
|
||||
} from "@chakra-ui/react";
|
||||
import * as yup from "yup";
|
||||
import React, { useState, useEffect } 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 { useCreateVideoArtifactsMutation, useUpdateVideoArtifactsMutation } from "../../../Services/io.service";
|
||||
import { useParams } from "react-router-dom";
|
||||
import ToastBox from "../../../Components/ToastBox";
|
||||
|
||||
const investmentVideoSchema = yup.object().shape({
|
||||
transactionDate: yup.string().required("Artifact name is required"),
|
||||
ioTransType_xid: yup.number().required("Artifact name is required"),
|
||||
transactionAmount: yup.number().required("Artifact name is required"),
|
||||
comments: yup.string().notRequired(),
|
||||
});
|
||||
|
||||
const AddCashDetails = ({ 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();
|
||||
|
||||
|
||||
const found = data?.find((item) => item?.id === actionId);
|
||||
console.log(found);
|
||||
|
||||
const [ createArtifactsVideo ] = useCreateVideoArtifactsMutation()
|
||||
const [ updateVideoArtifacts ] = useUpdateVideoArtifactsMutation()
|
||||
// const {
|
||||
// data
|
||||
// } = useGetArtifactsQuery(id)
|
||||
|
||||
const {
|
||||
control,
|
||||
handleSubmit,
|
||||
watch,
|
||||
reset,
|
||||
formState: { errors },
|
||||
} = useForm({
|
||||
resolver: yupResolver(investmentVideoSchema),
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
const onSubmit = async (data) => {
|
||||
console.log(data);
|
||||
|
||||
// setIsLoading(true)
|
||||
|
||||
|
||||
|
||||
// try {
|
||||
|
||||
|
||||
// if (found) {
|
||||
// const res = await updateVideoArtifacts({data, id: found?.id})
|
||||
// if (res?.data?.statusCode === 200) {
|
||||
// toast({
|
||||
// render: () => <ToastBox message={res?.data?.message} />,
|
||||
// });
|
||||
// setAlert(false);
|
||||
// setIsLoading(false)
|
||||
// handleClose();
|
||||
// }
|
||||
// } else {
|
||||
|
||||
// const res = await createArtifactsVideo({data, id})
|
||||
// if (res?.data?.statusCode === 200) {
|
||||
// toast({
|
||||
// render: () => <ToastBox message={res?.data?.message} />,
|
||||
// });
|
||||
// setAlert(false);
|
||||
// setIsLoading(false)
|
||||
// handleClose();
|
||||
// }
|
||||
|
||||
// }
|
||||
|
||||
|
||||
// } catch (error) {
|
||||
// console.log(error);
|
||||
|
||||
// }
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
const handleConfirm = () => {
|
||||
handleSubmit(onSubmit)();
|
||||
};
|
||||
|
||||
const handleSave = () => {
|
||||
handleSubmit(onSubmit)();
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
onClose()
|
||||
reset()
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Drawer
|
||||
size={"md"}
|
||||
isOpen={isOpen}
|
||||
placement="right"
|
||||
initialFocusRef={firstField}
|
||||
onClose={handleClose}
|
||||
>
|
||||
<DrawerOverlay />
|
||||
<DrawerContent>
|
||||
<DrawerCloseButton />
|
||||
<DrawerHeader fontSize={"sm"}>IO Cash Details</DrawerHeader>
|
||||
|
||||
<DrawerBody>
|
||||
<Stack spacing={4}>
|
||||
<FormControl isInvalid={errors.transactionDate}>
|
||||
<FormLabel fontSize={"sm"}>Date Selection</FormLabel>
|
||||
<Controller
|
||||
name="transactionDate"
|
||||
control={control}
|
||||
render={({ field }) => (
|
||||
<Input {...field} fontSize={"sm"} type="date" size={"sm"} />
|
||||
)}
|
||||
/>
|
||||
<FormErrorMessage fontSize={"xs"} fontWeight={500}>
|
||||
{errors.transactionDate?.message}
|
||||
</FormErrorMessage>
|
||||
</FormControl>
|
||||
|
||||
<FormControl isInvalid={errors.ioTransType_xid}>
|
||||
<FormLabel fontSize={"sm"}>Cash transaction</FormLabel>
|
||||
<Controller
|
||||
name="ioTransType_xid"
|
||||
control={control}
|
||||
render={({ field }) => (
|
||||
<Input {...field} textAlign={'end'} fontSize={"sm"} type="number" size={"sm"} />
|
||||
)}
|
||||
/>
|
||||
<FormErrorMessage fontSize={"xs"} fontWeight={500}>
|
||||
{errors.ioTransType_xid?.message}
|
||||
</FormErrorMessage>
|
||||
</FormControl>
|
||||
|
||||
|
||||
|
||||
|
||||
<FormControl isInvalid={errors.transactionAmount}>
|
||||
<FormLabel fontSize={"sm"}>Transaction Amount</FormLabel>
|
||||
<Controller
|
||||
name="transactionAmount"
|
||||
control={control}
|
||||
render={({ field }) => (
|
||||
<Input {...field} textAlign={'right'} fontSize={"sm"} type="number" size={"sm"} />
|
||||
)}
|
||||
/>
|
||||
<FormErrorMessage fontSize={"xs"} fontWeight={500}>
|
||||
{errors.transactionAmount?.message}
|
||||
</FormErrorMessage>
|
||||
</FormControl>
|
||||
|
||||
|
||||
|
||||
<FormControl isInvalid={errors.comments}>
|
||||
<FormLabel fontSize={"sm"}>Comments</FormLabel>
|
||||
<Controller
|
||||
name="comments"
|
||||
control={control}
|
||||
render={({ field }) => (
|
||||
<Textarea {...field} textAlign={'right'} 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 cash details?"}
|
||||
isLoading={isLoading}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default AddCashDetails;
|
||||
|
||||
@@ -61,7 +61,7 @@ const CreateIO = () => {
|
||||
isDisabled: id ? false : false,
|
||||
},
|
||||
{
|
||||
label: "IO Cash Details",
|
||||
label: "IO Cash Detail",
|
||||
Content: IOCashDetails,
|
||||
isDisabled: id ? false : false,
|
||||
},
|
||||
@@ -70,6 +70,11 @@ const CreateIO = () => {
|
||||
Content: IONAVDetails,
|
||||
isDisabled: id ? false : false,
|
||||
},
|
||||
{
|
||||
label: "Distribution to Investors",
|
||||
Content: IONAVDetails,
|
||||
isDisabled: id ? false : false,
|
||||
},
|
||||
];
|
||||
|
||||
const [tabs, setTabs] = useState(initialTabsState);
|
||||
|
||||
@@ -9,9 +9,10 @@ import {
|
||||
Text,
|
||||
Th,
|
||||
Tr,
|
||||
useDisclosure,
|
||||
useToast,
|
||||
} from "@chakra-ui/react";
|
||||
import React, { useContext, useEffect, useState } from "react";
|
||||
import React, { useContext, useEffect, useRef, useState } from "react";
|
||||
import { OPACITY_ON_LOAD } from "../../../Layout/animations";
|
||||
import DataTable from "../../../Components/DataTable/DataTable";
|
||||
import Pagination from "../../../Components/Pagination";
|
||||
@@ -19,11 +20,15 @@ import GlobalStateContext from "../../../Contexts/GlobalStateContext";
|
||||
import CustomAlertDialog from "../../../Components/CustomAlertDialog";
|
||||
import ToastBox from "../../../Components/ToastBox";
|
||||
import { debounce } from "../../Master/Sponser/AddSponser";
|
||||
import { AddIcon } from "@chakra-ui/icons";
|
||||
import AddCashDetails from "./AddCashDetails";
|
||||
|
||||
const formatDate = (date) => new Date(date).toLocaleDateString(); // Simple date formatter
|
||||
|
||||
const IOCashDetails = () => {
|
||||
const toast = useToast();
|
||||
const firstField = useRef();
|
||||
const { isOpen, onOpen, onClose } = useDisclosure();
|
||||
const { caseDetails, setCaseDetails, slideFromRight } =
|
||||
useContext(GlobalStateContext);
|
||||
const [searchTerm, setSearchTerm] = useState("");
|
||||
@@ -260,9 +265,9 @@ const IOCashDetails = () => {
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
/>
|
||||
|
||||
<HStack display={"flex"} alignItems={"center"}>
|
||||
<Pagination totalItems={10} />
|
||||
</HStack>
|
||||
|
||||
<Button onClick={onOpen} leftIcon={<AddIcon/>} colorScheme="forestGreen" size={'sm'} rounded={'sm'} fontSize={'xs'} >Add</Button>
|
||||
|
||||
</HStack>
|
||||
</Box>
|
||||
|
||||
@@ -287,6 +292,24 @@ const IOCashDetails = () => {
|
||||
alertHandler={handleDelete}
|
||||
isLoading={isLoading}
|
||||
/>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<AddCashDetails
|
||||
isOpen={isOpen}
|
||||
onClose={onClose}
|
||||
firstField={firstField} />
|
||||
|
||||
|
||||
|
||||
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -309,7 +309,6 @@ const IODetails = ({ enableNextTab, index, data }) => {
|
||||
},
|
||||
{
|
||||
label: "Expected Return",
|
||||
placeHolder: "$00.00",
|
||||
name: "expectedReturn",
|
||||
type: "text",
|
||||
isRequired: true,
|
||||
|
||||
@@ -148,15 +148,15 @@ const ViewIOTable = () => {
|
||||
pb={0.5}
|
||||
ps={4}
|
||||
pe={4}
|
||||
textTransform={"none"}
|
||||
variant={"solid"}
|
||||
// textTransform={"none"}
|
||||
variant={"subtle"}
|
||||
colorScheme={
|
||||
item?.ioStatus?.statusAdmin === "Draft"
|
||||
? "blue"
|
||||
: item?.ioStatus?.statusAdmin === "Processing"
|
||||
? "yellow"
|
||||
? "orange"
|
||||
: item?.ioStatus?.statusAdmin === "Open"
|
||||
? "forestGreen"
|
||||
? "green"
|
||||
: "red"
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ const ViewIOdata = () => {
|
||||
{ label: "Investors", content: <Investors data={data?.data} /> },
|
||||
{ label: "IO Cash Details", content: <IOCashDetails data={data?.data} /> },
|
||||
{ label: "IO NAV Details", content: <IONAVDetails data={data?.data} /> },
|
||||
// { label: "Distribution", content: <ViewDistribution /> },
|
||||
{ label: "Distribution to Investors", content: <IONAVDetails data={data?.data} /> },
|
||||
];
|
||||
|
||||
return (
|
||||
|
||||
@@ -46,10 +46,7 @@ const ViewIOdataHeader = () => {
|
||||
const { isOpen, onOpen, onClose } = useDisclosure();
|
||||
const btnRef = useRef();
|
||||
const { IODetails } = useContext(GlobalStateContext);
|
||||
console.log(
|
||||
"=================>>>>>",
|
||||
IODetails?.artifactsImage?.[0]?.artifactPathName
|
||||
);
|
||||
|
||||
|
||||
const {
|
||||
isOpen: isInvestmentOpen,
|
||||
@@ -105,6 +102,58 @@ const ViewIOdataHeader = () => {
|
||||
fontSize: "0.875rem",
|
||||
fontWeight: "400",
|
||||
};
|
||||
|
||||
|
||||
|
||||
const menu = [
|
||||
{
|
||||
id:1,
|
||||
title:"Amount Invested",
|
||||
onClickFunction: onInvestmentOpen
|
||||
},
|
||||
{
|
||||
id:2,
|
||||
title:"Fees & Expenses",
|
||||
onClickFunction:onFeesOpen
|
||||
},
|
||||
{
|
||||
id:3,
|
||||
title:"Distribution from Sponsors",
|
||||
onClickFunction:onDistSponsorOpen
|
||||
},
|
||||
{
|
||||
id:4,
|
||||
title:"Distribution To investors",
|
||||
onClickFunction:onDistInvestorOpen
|
||||
},
|
||||
{
|
||||
id:5,
|
||||
title:"Update iO NAV",
|
||||
onClickFunction:onUpdateNavOpen
|
||||
},
|
||||
{
|
||||
id:6,
|
||||
title:"Exit",
|
||||
onClickFunction:onExitOpen
|
||||
},
|
||||
{
|
||||
id:7,
|
||||
title:"Cancel",
|
||||
onClickFunction:onCancleOpen
|
||||
},
|
||||
{
|
||||
id:8,
|
||||
title:"Update iO status",
|
||||
onClickFunction:onUpdateStatusOpen
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return (
|
||||
<Box
|
||||
display={"flex"}
|
||||
@@ -118,7 +167,7 @@ const ViewIOdataHeader = () => {
|
||||
// bgGradient='linear(to-r, #caf5d8, #d4a5a5)'
|
||||
// bgGradient='linear(to-r, #caf5d8, #b3e5fc)'
|
||||
// bgGradient='linear(to-r, #ffd54f, #caf5d8)'
|
||||
// bgGradient='linear(to-r, #caf5d8, #a8e6cf)'
|
||||
bgGradient='linear(to-r, #caf5d8, #a8e6cf)'
|
||||
boxShadow={"md"}
|
||||
paddingRight={"10px"}
|
||||
borderRadius={"10px"}
|
||||
@@ -152,23 +201,7 @@ const ViewIOdataHeader = () => {
|
||||
</Box>
|
||||
)}
|
||||
</Box>
|
||||
{/* <Box display={"flex"} flexDirection={"column"} gap={2}>
|
||||
<Text as={"span"} fontSize={"sm"} fontWeight={"500"}>
|
||||
IO name: <Text as={'span'} ms={2}>{foundObject?.ioName}</Text>
|
||||
</Text>
|
||||
<Text as={"span"} fontSize={"sm"} fontWeight={"500"}>
|
||||
Sponsor name: <Text as={'span'} ms={2}>{foundObject?.sponserName}</Text>
|
||||
</Text>
|
||||
</Box> */}
|
||||
|
||||
{/* <Box display={"flex"} flexDirection={"column"} gap={2}>
|
||||
<Text as={"span"} fontSize={"xs"} color={"gray.500"} fontWeight={"500"}>
|
||||
IO ID
|
||||
</Text>
|
||||
<Text as={"span"} fontSize={"sm"} fontWeight={"500"}>
|
||||
{IODetails?.io_id ? IODetails?.io_id : "---"}
|
||||
</Text>
|
||||
</Box> */}
|
||||
|
||||
|
||||
<Box display={"flex"} w={"auto"} flexDirection={"column"} gap={2}>
|
||||
<Text as={"span"} fontSize={"xs"} color={"gray.500"} fontWeight={"500"}>
|
||||
@@ -202,15 +235,15 @@ const ViewIOdataHeader = () => {
|
||||
pb={0.5}
|
||||
ps={4}
|
||||
pe={4}
|
||||
textTransform={"none"}
|
||||
variant={"solid"}
|
||||
// textTransform={"none"}
|
||||
variant={"subtle"}
|
||||
colorScheme={
|
||||
IODetails?.ioStatus?.statusAdmin === "Draft"
|
||||
? "blue"
|
||||
: IODetails?.ioStatus?.statusAdmin === "Processing"
|
||||
? "yellow"
|
||||
? "orange"
|
||||
: IODetails?.ioStatus?.statusAdmin === "Open"
|
||||
? "forestGreen"
|
||||
? "green"
|
||||
: IODetails?.ioStatus?.statusAdmin === "Closed"
|
||||
? "red"
|
||||
: "gray"
|
||||
@@ -275,113 +308,18 @@ const ViewIOdataHeader = () => {
|
||||
>
|
||||
Tansaction
|
||||
</MenuItem>
|
||||
<MenuItem onClick={onInvestmentOpen} className="border-bottom">
|
||||
Amount Invested
|
||||
</MenuItem>
|
||||
<MenuItem onClick={onFeesOpen} className="border-bottom">
|
||||
Fees & Expenses
|
||||
</MenuItem>
|
||||
<MenuItem onClick={onDistSponsorOpen} className="border-bottom">
|
||||
Distribution from Sponsors
|
||||
</MenuItem>
|
||||
<MenuItem onClick={onDistInvestorOpen} className="border-bottom">
|
||||
Distribution To investors
|
||||
</MenuItem>
|
||||
<MenuItem onClick={onUpdateNavOpen} className="border-bottom">
|
||||
Update iO NAV
|
||||
</MenuItem>
|
||||
<MenuItem onClick={onExitOpen} className="border-bottom">
|
||||
Exit
|
||||
</MenuItem>
|
||||
<MenuItem onClick={onCancleOpen} className="border-bottom">
|
||||
Cancel
|
||||
</MenuItem>
|
||||
<MenuItem onClick={onUpdateStatusOpen}>Update iO status</MenuItem>
|
||||
|
||||
{
|
||||
menu?.map(({id, title, onClickFunction})=><MenuItem key={id} onClick={onClickFunction} className="border-bottom">
|
||||
{title}
|
||||
</MenuItem>)
|
||||
}
|
||||
|
||||
|
||||
</MenuList>
|
||||
</Menu>
|
||||
|
||||
{/* Drawer */}
|
||||
{/* <Drawer
|
||||
isOpen={isOpen}
|
||||
placement="right"
|
||||
onClose={onClose}
|
||||
finalFocusRef={btnRef}
|
||||
>
|
||||
<DrawerOverlay />
|
||||
<DrawerContent>
|
||||
<DrawerCloseButton />
|
||||
<DrawerHeader>Transaction</DrawerHeader>
|
||||
|
||||
<DrawerBody>
|
||||
<Box
|
||||
display={"grid"}
|
||||
alignContent={"left"}
|
||||
justifyItems={"start"}
|
||||
>
|
||||
<Button
|
||||
onClick={onInvestmentOpen}
|
||||
bg={bg}
|
||||
_hover={hover}
|
||||
paddingInline={"0px"}
|
||||
>
|
||||
Amount Invested
|
||||
</Button>
|
||||
<Divider />
|
||||
<Button
|
||||
onClick={onFeesOpen}
|
||||
bg={bg}
|
||||
_hover={hover}
|
||||
paddingInline={"0px"}
|
||||
>
|
||||
Fees & Expenses
|
||||
</Button>
|
||||
<Divider />
|
||||
<Button
|
||||
onClick={onDistSponsorOpen}
|
||||
bg={bg}
|
||||
_hover={hover}
|
||||
paddingInline={"0px"}
|
||||
>
|
||||
Distribution from Sponsors
|
||||
</Button>
|
||||
<Divider />
|
||||
<Button
|
||||
onClick={onDistInvestorOpen}
|
||||
bg={bg}
|
||||
_hover={hover}
|
||||
paddingInline={"0px"}
|
||||
>
|
||||
Distribution To Investors
|
||||
</Button>
|
||||
<Divider />
|
||||
<Button
|
||||
onClick={onUpdateNavOpen}
|
||||
bg={bg}
|
||||
_hover={hover}
|
||||
paddingInline={"0px"}
|
||||
>
|
||||
Update IO NAV
|
||||
</Button>
|
||||
<Divider />
|
||||
<Button
|
||||
onClick={onUpdateStatusOpen}
|
||||
bg={bg}
|
||||
_hover={hover}
|
||||
paddingInline={"0px"}
|
||||
>
|
||||
Update IO Status
|
||||
</Button>
|
||||
<Divider />
|
||||
</Box>
|
||||
</DrawerBody>
|
||||
|
||||
<DrawerFooter>
|
||||
<Button variant="outline" mr={3} onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
</DrawerFooter>
|
||||
</DrawerContent>
|
||||
</Drawer> */}
|
||||
|
||||
|
||||
{/* Modals */}
|
||||
<AmountInvested isOpen={isInvestmentOpen} onClose={onInvestmentClose} />
|
||||
|
||||
@@ -22,8 +22,19 @@ import {
|
||||
} from "@chakra-ui/react";
|
||||
import GlobalStateContext from "../Contexts/GlobalStateContext";
|
||||
import Cookies from "js-cookie";
|
||||
import { validationSchema } from "../Validations/Validations";
|
||||
import ToastBox from "../Components/ToastBox";
|
||||
import { useLoginMutation } from "../Services/token.serivce";
|
||||
|
||||
|
||||
// import { yupResolver } from "@hookform/resolvers/yup";
|
||||
import * as Yup from "yup";
|
||||
|
||||
|
||||
const validationSchema = Yup.object().shape({
|
||||
emailAddress: Yup.string().required("Email address is required"),
|
||||
password_hash: Yup.string().required("Password is required"),
|
||||
});
|
||||
|
||||
|
||||
const Login = () => {
|
||||
const [show, setShow] = useState(false);
|
||||
@@ -36,43 +47,78 @@ const Login = () => {
|
||||
const navigate = useNavigate();
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const [login] = useLoginMutation()
|
||||
|
||||
useEffect(() => {
|
||||
if (isAuthenticate) {
|
||||
navigate("/");
|
||||
}
|
||||
}, [navigate, isAuthenticate]);
|
||||
|
||||
const onSubmit = (value) => {
|
||||
const onSubmit = async (value) => {
|
||||
setIsLoading(true);
|
||||
if (value.name === "admin@tanami.com" && value.password === "Admin@123") {
|
||||
return setTimeout(() => {
|
||||
// dispatch(loginUser(true));
|
||||
try {
|
||||
const res = await login(value).unwrap();
|
||||
console.log(res);
|
||||
|
||||
if (res?.statusCode === 200) {
|
||||
toast({
|
||||
render: () => (
|
||||
<ToastBox status={"success"} message={res?.message} />
|
||||
),
|
||||
})
|
||||
setIsLoading(false);
|
||||
setIsAuthenticate(true);
|
||||
setIsLoading(false);
|
||||
toast({
|
||||
render: () => (
|
||||
<ToastBox status={"success"} message={"Login Successfully"} />
|
||||
),
|
||||
});
|
||||
|
||||
Cookies.set("isAuthenticated", true, { expires: 7 });
|
||||
navigate("/");
|
||||
}, 2000); // 3-second delay
|
||||
} else {
|
||||
return setTimeout(() => {
|
||||
// dispatch(loginUser(true));
|
||||
setIsAuthenticate(false);
|
||||
setIsLoading(false);
|
||||
navigate("/");
|
||||
reset();
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
if (err) {
|
||||
toast({
|
||||
render: () => (
|
||||
<ToastBox status={"error"} message={"Invalid credentials"} />
|
||||
<ToastBox status={"error"} message={err?.data?.message} />
|
||||
),
|
||||
});
|
||||
reset();
|
||||
navigate("/login");
|
||||
}, 2000);
|
||||
setIsLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// if (value.emailAddress === "admin@tanami.com" && value.password_hash === "Admin@123") {
|
||||
// return setTimeout(() => {
|
||||
// // dispatch(loginUser(true));
|
||||
// setIsAuthenticate(true);
|
||||
// setIsLoading(false);
|
||||
// toast({
|
||||
// render: () => (
|
||||
// <ToastBox status={"success"} message={"Login Successfully"} />
|
||||
// ),
|
||||
// });
|
||||
|
||||
// Cookies.set("isAuthenticated", true, { expires: 7 });
|
||||
// navigate("/");
|
||||
// }, 2000); // 3-second delay
|
||||
// } else {
|
||||
// return setTimeout(() => {
|
||||
// // dispatch(loginUser(true));
|
||||
// setIsAuthenticate(false);
|
||||
// setIsLoading(false);
|
||||
|
||||
// toast({
|
||||
// render: () => (
|
||||
// <ToastBox status={"error"} message={"Invalid credentials"} />
|
||||
// ),
|
||||
// });
|
||||
// reset();
|
||||
// navigate("/login");
|
||||
// }, 2000);
|
||||
// }
|
||||
};
|
||||
|
||||
const {
|
||||
@@ -84,6 +130,9 @@ const Login = () => {
|
||||
resolver: yupResolver(validationSchema),
|
||||
});
|
||||
|
||||
console.log(errors);
|
||||
|
||||
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
@@ -138,18 +187,18 @@ const Login = () => {
|
||||
</FormLabel>
|
||||
|
||||
<Input
|
||||
{...register("name")}
|
||||
{...register("emailAddress")}
|
||||
focusBorderColor="green.500"
|
||||
type="text"
|
||||
name="name"
|
||||
name="emailAddress"
|
||||
variant="filled"
|
||||
placeholder="Email"
|
||||
size="lg"
|
||||
className="web-text-medium"
|
||||
/>
|
||||
{errors.name && (
|
||||
{errors.emailAddress && (
|
||||
<span className="text-danger web-text-small fw-bold ps-2 d-flex align-items-center gap-1 mt-1">
|
||||
<TiWarning className="fw-bold fs-5 " /> {errors.name.message}
|
||||
<TiWarning className="fw-bold fs-5 " /> {errors.emailAddress.message}
|
||||
</span>
|
||||
)}
|
||||
</FormControl>
|
||||
@@ -161,7 +210,7 @@ const Login = () => {
|
||||
|
||||
<InputGroup size="lg">
|
||||
<Input
|
||||
{...register("password")}
|
||||
{...register("password_hash")}
|
||||
className="web-text-medium"
|
||||
focusBorderColor="green.500"
|
||||
variant="filled"
|
||||
@@ -181,9 +230,9 @@ const Login = () => {
|
||||
</Button>
|
||||
</InputRightElement>
|
||||
</InputGroup>
|
||||
{errors.password && (
|
||||
{errors.password_hash && (
|
||||
<span className="text-danger web-text-small fw-bold ps-2 d-flex align-items-center gap-1 mt-1">
|
||||
<TiWarning className="fw-bold fs-5 " /> {errors.password.message}
|
||||
<TiWarning className="fw-bold fs-5 " /> {errors.password_hash.message}
|
||||
</span>
|
||||
)}
|
||||
</FormControl>
|
||||
|
||||
@@ -44,7 +44,7 @@ const formatDateValue = (date) => {
|
||||
return [year, month, day].join("-");
|
||||
};
|
||||
|
||||
const EditExchangeRate = ({ id, setIsLoading, updateHistory }) => {
|
||||
const EditExchangeRate = ({ id, setIsLoading }) => {
|
||||
const btnRef = useRef();
|
||||
const toast = useToast();
|
||||
const { isOpen, onOpen, onClose } = useDisclosure();
|
||||
@@ -115,7 +115,7 @@ const EditExchangeRate = ({ id, setIsLoading, updateHistory }) => {
|
||||
</Button>
|
||||
</Tooltip>
|
||||
<Drawer
|
||||
size={"md"}
|
||||
// size={"md"}
|
||||
isOpen={isOpen}
|
||||
placement="right"
|
||||
onClose={onClose}
|
||||
|
||||
@@ -46,7 +46,6 @@ const ExchangeRate = () => {
|
||||
const [actionId, setActionId] = useState(false);
|
||||
const [mouseEntered, setMouseEntered] = useState(false);
|
||||
const [mouseEnteredId, setMouseEnteredId] = useState("");
|
||||
const [history, setHistory] = useState([]);
|
||||
|
||||
// ===============================[ Paginations ]
|
||||
const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
|
||||
@@ -61,33 +60,6 @@ const ExchangeRate = () => {
|
||||
console.log(data?.data);
|
||||
|
||||
|
||||
|
||||
const updateHistory = (id, previousRate, newRate, effectFrom) => {
|
||||
setHistory((prevHistory) => [
|
||||
...prevHistory,
|
||||
{ id, effectFrom, previousRate, newRate },
|
||||
]);
|
||||
};
|
||||
|
||||
// ====================================================[Table Filter]================================================================
|
||||
const filteredData = rateExchange.filter((item) => {
|
||||
// Filter by name (case insensitive)
|
||||
const name = item.fromCurr;
|
||||
const searchLower = searchTerm.toLowerCase();
|
||||
const nameMatches = name.toLowerCase().includes(searchLower);
|
||||
|
||||
// Filter by status
|
||||
// const status = item.status;
|
||||
// const statusLower = status ? "active" : "inactive";
|
||||
|
||||
// const statusMatches =
|
||||
// statusFilter === "all" ||
|
||||
// (statusFilter === "active" && status === true) ||
|
||||
// (statusFilter === "inactive" && status === false);
|
||||
|
||||
return nameMatches;
|
||||
});
|
||||
|
||||
// ====================================================[Table Setup]================================================================
|
||||
const tableHeadRow = [
|
||||
"Sr.No",
|
||||
@@ -163,7 +135,7 @@ const ExchangeRate = () => {
|
||||
<EditExchangeRate
|
||||
setIsLoading={setIsLoading}
|
||||
id={item.id}
|
||||
updateHistory={updateHistory}
|
||||
// updateHistory={updateHistory}
|
||||
/>
|
||||
|
||||
<Tooltip
|
||||
|
||||
@@ -3,7 +3,8 @@ import welcome from '../assets/welcome.avif';
|
||||
import welcome2 from '../assets/welcome2.avif';
|
||||
import welcome3 from '../assets/welcome3.avif';
|
||||
import welcome4 from '../assets/welcome4.avif';
|
||||
import { Box, Button } from '@chakra-ui/react';
|
||||
import { Box, Button, Image } from '@chakra-ui/react';
|
||||
import logo from "../../src/assets/logo.png"
|
||||
|
||||
const Welcome = () => {
|
||||
return (
|
||||
@@ -11,35 +12,40 @@ const Welcome = () => {
|
||||
<div id="carouselExampleSlidesOnly" className="carousel slide" data-bs-ride="carousel">
|
||||
<div className="carousel-inner">
|
||||
<div className="carousel-item active" data-bs-interval="3000">
|
||||
<img src={welcome2} className="d-block w-100" alt="Welcome 2" />
|
||||
<img src={welcome4} className="d-block w-100" alt="Welcome 2" />
|
||||
</div>
|
||||
<div className="carousel-item" data-bs-interval="3000">
|
||||
<img src={welcome3} className="d-block w-100" alt="Welcome 3" />
|
||||
</div>
|
||||
<div className="carousel-item" data-bs-interval="3000">
|
||||
<img src={welcome4} className="d-block w-100" alt="Welcome 4" />
|
||||
<img src={welcome2} className="d-block w-100" alt="Welcome 4" />
|
||||
</div>
|
||||
</div>
|
||||
<a className="carousel-control-prev" href="#carouselExampleSlidesOnly" role="button" data-bs-slide="prev">
|
||||
{/* <a className="carousel-control-prev" href="#carouselExampleSlidesOnly" role="button" data-bs-slide="prev">
|
||||
<span className="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||
<span className="visually-hidden">Previous</span>
|
||||
</a>
|
||||
<a className="carousel-control-next" href="#carouselExampleSlidesOnly" role="button" data-bs-slide="next">
|
||||
<span className="carousel-control-next-icon" aria-hidden="true"></span>
|
||||
<span className="visually-hidden">Next</span>
|
||||
</a>
|
||||
</a> */}
|
||||
</div>
|
||||
<Box
|
||||
opacity={1}
|
||||
// bgGradient="linear(to-b, rgba(0, 0, 0, 0.5), #0047178e 80%)"
|
||||
bgGradient="linear(to-b, rgba(0, 0, 0, 0.5), #0047178e 100%)"
|
||||
zIndex={999}
|
||||
position="absolute"
|
||||
top={0}
|
||||
left={0}
|
||||
w="100%"
|
||||
h="100%"
|
||||
display={'flex'}
|
||||
justifyContent={'center'}
|
||||
alignItems={'center'}
|
||||
>
|
||||
<Box
|
||||
<Image src={logo} />
|
||||
|
||||
{/* <Box
|
||||
position="absolute"
|
||||
bottom={12}
|
||||
right={0}
|
||||
@@ -48,7 +54,7 @@ const Welcome = () => {
|
||||
<Button color={'#004717'} size={'lg'} bg="white" variant="solid">
|
||||
Let's get started
|
||||
</Button>
|
||||
</Box>
|
||||
</Box> */}
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
// io.service.js
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { api } from "./api.service";
|
||||
// import { api } from "./api.service";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
const baseUrl = api?.defaults.baseURL;
|
||||
// const baseUrl = api?.defaults.baseURL;
|
||||
|
||||
export const keyMerits = createApi({
|
||||
reducerPath: "ioService",
|
||||
baseQuery: fetchBaseQuery({ baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getKeyMerits"],
|
||||
endpoints: (builder) => ({
|
||||
// =====[get]
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// investorDetails.service.js
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { api } from "./api.service";
|
||||
// import { api } from "./api.service";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
const baseUrl = api?.defaults.baseURL;
|
||||
// const baseUrl = api?.defaults.baseURL;
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const bankDetails = createApi({
|
||||
reducerPath: "bankDetails",
|
||||
baseQuery: fetchBaseQuery({ baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getBank"],
|
||||
|
||||
endpoints: (builder) => ({
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// investorDetails.service.js
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { api } from "./api.service";
|
||||
// import { api } from "./api.service";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
const baseUrl = api?.defaults.baseURL;
|
||||
// const baseUrl = api?.defaults.baseURL;
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const contact = createApi({
|
||||
reducerPath: "contact",
|
||||
baseQuery: fetchBaseQuery({ baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getContact"],
|
||||
endpoints: (builder) => ({
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// investorDetails.service.js
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { api } from "./api.service";
|
||||
// import { api } from "./api.service";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
const baseUrl = api?.defaults.baseURL;
|
||||
// const baseUrl = api?.defaults.baseURL;
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const depositRequest = createApi({
|
||||
reducerPath: "depositRequest",
|
||||
baseQuery: fetchBaseQuery({ baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getDepositRequest"],
|
||||
endpoints: (builder) => ({
|
||||
getDepositRequest: builder.query({
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// exchangeRate.service.js
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { api } from "./api.service";
|
||||
// import { api } from "./api.service";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
const baseUrl = api?.defaults.baseURL;
|
||||
// const baseUrl = api?.defaults.baseURL;
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const exchangeRate = createApi({
|
||||
reducerPath: "exchangeRate",
|
||||
baseQuery: fetchBaseQuery({ baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getAllExchangeRate", "getExchangeById"],
|
||||
|
||||
endpoints: (builder) => ({
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
// io.service.js
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { api } from "./api.service";
|
||||
// import { api } from "./api.service";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
const baseUrl = api?.defaults.baseURL;
|
||||
// const baseUrl = api?.defaults.baseURL;
|
||||
|
||||
export const ioService = createApi({
|
||||
reducerPath: "ioService",
|
||||
baseQuery: fetchBaseQuery({ baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getInvestmentDocuments"],
|
||||
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// investmentType.service.js
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { api } from "./api.service";
|
||||
// import { api } from "./api.service";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
const baseUrl = api?.defaults.baseURL;
|
||||
// const baseUrl = api?.defaults.baseURL;
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const investmentType = createApi({
|
||||
reducerPath: "investmentType",
|
||||
baseQuery: fetchBaseQuery({ baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getInvestmentType", "getInvestmentTypeID"],
|
||||
endpoints: (builder) => ({
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// investorDetails.service.js
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { api } from "./api.service";
|
||||
// import { api } from "./api.service";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
const baseUrl = api?.defaults.baseURL;
|
||||
// const baseUrl = api?.defaults.baseURL;
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const investorDetails = createApi({
|
||||
reducerPath: "investorDetails",
|
||||
baseQuery: fetchBaseQuery({ baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: [],
|
||||
endpoints: (builder) => ({
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
// investorTransaction.service.js
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
const baseUrl = import.meta.env.VITE_API_BASE_URL + "/api";
|
||||
// const baseUrl = import.meta.env.VITE_API_BASE_URL + "/api";
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const investorTransaction = createApi({
|
||||
reducerPath: "investorTransaction",
|
||||
baseQuery: fetchBaseQuery({ baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: [],
|
||||
endpoints: (builder) => ({
|
||||
getTransactions: builder.query({
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
// io.service.js
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { api } from "./api.service";
|
||||
// import { api } from "./api.service";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
const baseUrl = api?.defaults.baseURL;
|
||||
// const baseUrl = api?.defaults.baseURL;
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const ioService = createApi({
|
||||
reducerPath: "ioService",
|
||||
baseQuery: fetchBaseQuery({ baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: [
|
||||
"prePopulate",
|
||||
"getIO",
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
//sponser.service
|
||||
// Need to use the React-specific entry point to import createApi
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { api } from "./api.service";
|
||||
// import { api } from "./api.service";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
// const baseUrl = api?.defaults.baseURL;
|
||||
|
||||
|
||||
const baseUrl = api?.defaults.baseURL;
|
||||
|
||||
// const baseUrl = `${import.meta.env.VITE_API_BASE_URL}/${import.meta.env.VITE_API_VERSION}`
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const sponserMaster = createApi({
|
||||
reducerPath: "sponserMaster",
|
||||
baseQuery: fetchBaseQuery({ baseUrl: baseUrl }),
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getSponser"],
|
||||
endpoints: (builder) => ({
|
||||
|
||||
|
||||
47
src/Services/token.serivce.js
Normal file
47
src/Services/token.serivce.js
Normal file
@@ -0,0 +1,47 @@
|
||||
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
|
||||
|
||||
// Define a base query function with RTK Query
|
||||
export const baseQuery = fetchBaseQuery({
|
||||
baseUrl: 'https://sprint4.tanami.betadelivery.com/api/v1',
|
||||
prepareHeaders: (headers) => {
|
||||
const token = localStorage.getItem('accessToken');
|
||||
if (token) {
|
||||
headers.set('x-auth-token', `${token}`);
|
||||
}
|
||||
return headers;
|
||||
},
|
||||
});
|
||||
|
||||
// Create an RTK Query API slice
|
||||
export const apiSlice = createApi({
|
||||
reducerPath: 'api',
|
||||
baseQuery: baseQuery,
|
||||
endpoints: (builder) => ({
|
||||
login: builder.mutation({
|
||||
query: (credentials) => ({
|
||||
url: '/auth/admin',
|
||||
method: 'POST',
|
||||
body: credentials,
|
||||
}),
|
||||
async onQueryStarted(arg, { dispatch, queryFulfilled }) {
|
||||
try {
|
||||
const { data } = await queryFulfilled;
|
||||
// Store tokens in local storage
|
||||
localStorage.setItem('accessToken', data?.data?.access?.token);
|
||||
localStorage.setItem('refreshToken', data?.data?.refresh?.token);
|
||||
} catch (error) {
|
||||
console.error('Login failed:', error);
|
||||
}
|
||||
},
|
||||
}),
|
||||
refreshToken: builder.mutation({
|
||||
query: (refreshToken) => ({
|
||||
url: '/refresh_token',
|
||||
method: 'POST',
|
||||
body: { refreshToken },
|
||||
}),
|
||||
}),
|
||||
}),
|
||||
});
|
||||
|
||||
export const { useLoginMutation, useRefreshTokenMutation } = apiSlice;
|
||||
@@ -6,14 +6,16 @@ import { exchangeRate } from "../Services/exchange.rate.service";
|
||||
import { ioService } from "../Services/io.service";
|
||||
import { investorDetails } from "../Services/investor.details.service";
|
||||
import { investorTransaction } from "../Services/investor.transaction.service";
|
||||
import { api } from "../Services/api.service";
|
||||
import { keyMerits } from "../Services/Key.merits.service";
|
||||
// import { api } from "../Services/api.service";
|
||||
// import { keyMerits } from "../Services/Key.merits.service";
|
||||
import { bankDetails } from "../Services/bank.details.service";
|
||||
import { contact } from "../Services/contact.service";
|
||||
import { depositRequest } from "../Services/deposit.request.service";
|
||||
import { apiSlice, baseQuery } from "../Services/token.serivce";
|
||||
|
||||
export const store = configureStore({
|
||||
reducer: {
|
||||
[apiSlice.reducerPath]: apiSlice.reducer,
|
||||
[sponserMaster.reducerPath]: sponserMaster.reducer,
|
||||
[investmentType.reducerPath]: investmentType.reducer,
|
||||
[exchangeRate.reducerPath]: exchangeRate.reducer,
|
||||
@@ -28,9 +30,10 @@ export const store = configureStore({
|
||||
middleware: (getDefaultMiddleware) =>
|
||||
getDefaultMiddleware({
|
||||
thunk: {
|
||||
extraArgument: api, // Pass Axios instance as extra argument
|
||||
extraArgument: baseQuery, // Pass Axios instance as extra argument
|
||||
},
|
||||
}).concat(
|
||||
apiSlice.middleware,
|
||||
sponserMaster.middleware,
|
||||
investmentType.middleware,
|
||||
exchangeRate.middleware,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import * as Yup from "yup";
|
||||
|
||||
export const validationSchema = Yup.object().shape({
|
||||
name: Yup.string().required("Owner name is required"),
|
||||
name: Yup.string().required("Email name is required"),
|
||||
password: Yup.string().required("Password is required"),
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user