This commit is contained in:
YasinShaikh123
2024-08-07 20:19:18 +05:30
26 changed files with 550 additions and 252 deletions

View File

@@ -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>

View 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;

View File

@@ -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);

View File

@@ -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>
);
};

View File

@@ -309,7 +309,6 @@ const IODetails = ({ enableNextTab, index, data }) => {
},
{
label: "Expected Return",
placeHolder: "$00.00",
name: "expectedReturn",
type: "text",
isRequired: true,

View File

@@ -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"
}

View File

@@ -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 (

View File

@@ -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} />

View File

@@ -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>

View File

@@ -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}

View File

@@ -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

View File

@@ -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>
);

View File

@@ -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]

View File

@@ -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) => ({

View File

@@ -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) => ({

View File

@@ -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({

View File

@@ -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) => ({

View File

@@ -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"],

View File

@@ -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) => ({

View File

@@ -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) => ({

View File

@@ -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({

View File

@@ -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",

View File

@@ -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) => ({

View 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;

View File

@@ -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,

View File

@@ -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"),
});