Compare commits

9 Commits
dev ... main

Author SHA1 Message Date
0b9554d0a4 update 2024-09-30 19:53:32 +05:30
YasinShaikh123
ee64ffaa9a Merge branch 'main' of http://git.wdipl.com/Siddhesh.More/optifii-admin 2024-09-30 13:16:07 +05:30
6179f4e371 update 2024-09-27 22:34:20 +05:30
YasinShaikh123
f17209ef43 Registered Corp 2024-09-27 20:53:28 +05:30
d6b084970a upatee 2024-09-27 15:52:41 +05:30
YasinShaikh123
954ed070d6 Route Update👍 2024-09-26 19:59:03 +05:30
0e4301fedb update 🦄 2024-09-26 19:40:13 +05:30
priyanshuvish
e2fa961f63 Merge branch 'main' of http://git.wdipl.com/Siddhesh.More/optifii-admin 2024-09-26 12:12:06 +05:30
priyanshuvish
0a73b155ac tab pending 2024-09-25 20:16:48 +05:30
51 changed files with 2061 additions and 1546 deletions

61
package-lock.json generated
View File

@@ -19,7 +19,7 @@
"bootstrap": "5.3.3", "bootstrap": "5.3.3",
"chart.js": "^4.4.3", "chart.js": "^4.4.3",
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"framer-motion": "^11.1.5", "framer-motion": "^11.6.0",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"react": "^18.2.0", "react": "^18.2.0",
"react-apexcharts": "^1.4.1", "react-apexcharts": "^1.4.1",
@@ -28,19 +28,21 @@
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-hook-form": "^7.51.3", "react-hook-form": "^7.51.3",
"react-icons": "^5.1.0", "react-icons": "^5.1.0",
"react-phone-input-2": "^2.15.1",
"react-quill": "^0.0.2", "react-quill": "^0.0.2",
"react-redux": "^9.1.1", "react-redux": "^9.1.1",
"react-router-dom": "^6.22.3", "react-router-dom": "^6.22.3",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"redux-persist-transform-encrypt": "^5.1.1", "redux-persist-transform-encrypt": "^5.1.1",
"uuid": "^10.0.0", "uuid": "^10.0.0",
"vanilla-tilt": "^1.8.1",
"xlsx": "^0.18.5", "xlsx": "^0.18.5",
"yup": "^1.4.0" "yup": "^1.4.0"
}, },
"devDependencies": { "devDependencies": {
"@types/react": "^18.2.66", "@types/react": "^18.2.66",
"@types/react-dom": "^18.2.22", "@types/react-dom": "^18.2.22",
"@vitejs/plugin-react-swc": "^3.5.0", "@vitejs/plugin-react-swc": "^3.7.0",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-plugin-react": "^7.34.1", "eslint-plugin-react": "^7.34.1",
"eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-hooks": "^4.6.0",
@@ -2816,7 +2818,6 @@
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz",
"integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@swc/core": "^1.5.7" "@swc/core": "^1.5.7"
}, },
@@ -3255,6 +3256,11 @@
"pnpm": ">=8" "pnpm": ">=8"
} }
}, },
"node_modules/classnames": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
"integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
},
"node_modules/codepage": { "node_modules/codepage": {
"version": "1.15.0", "version": "1.15.0",
"resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
@@ -4278,10 +4284,9 @@
} }
}, },
"node_modules/framer-motion": { "node_modules/framer-motion": {
"version": "11.3.28", "version": "11.6.0",
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.3.28.tgz", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.6.0.tgz",
"integrity": "sha512-dqhoawipEAjqdv32zbv72sOMJZjol7dROWn7t/FOq23WXJ40O4OUybgnO2ldnuS+3YquSn8xO/KKRavZ+TBVOQ==", "integrity": "sha512-+NJ8MpS2A7apQf3WjSrMl6xlQeYVmPGp8OZ0grNKJEyEILl6EerQrvj2bc+MgrsUndbweZsYdog1/NsxRrkWdA==",
"license": "MIT",
"dependencies": { "dependencies": {
"tslib": "^2.4.0" "tslib": "^2.4.0"
}, },
@@ -5232,6 +5237,16 @@
], ],
"license": "MIT" "license": "MIT"
}, },
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
"node_modules/lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
"integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
},
"node_modules/lodash.merge": { "node_modules/lodash.merge": {
"version": "4.6.2", "version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -5245,6 +5260,16 @@
"integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/lodash.reduce": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
"integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw=="
},
"node_modules/lodash.startswith": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz",
"integrity": "sha512-XClYR1h4/fJ7H+mmCKppbiBmljN/nGs73iq2SjCT9SF4CBPoUHzLvWmH1GtZMhMBZSiRkHXfeA2RY1eIlJ75ww=="
},
"node_modules/loose-envify": { "node_modules/loose-envify": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -5875,6 +5900,23 @@
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/react-phone-input-2": {
"version": "2.15.1",
"resolved": "https://registry.npmjs.org/react-phone-input-2/-/react-phone-input-2-2.15.1.tgz",
"integrity": "sha512-W03abwhXcwUoq+vUFvC6ch2+LJYMN8qSOiO889UH6S7SyMCQvox/LF3QWt+cZagZrRdi5z2ON3omnjoCUmlaYw==",
"dependencies": {
"classnames": "^2.2.6",
"lodash.debounce": "^4.0.8",
"lodash.memoize": "^4.1.2",
"lodash.reduce": "^4.6.0",
"lodash.startswith": "^4.2.1",
"prop-types": "^15.7.2"
},
"peerDependencies": {
"react": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
"react-dom": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0"
}
},
"node_modules/react-quill": { "node_modules/react-quill": {
"version": "0.0.2", "version": "0.0.2",
"resolved": "https://registry.npmjs.org/react-quill/-/react-quill-0.0.2.tgz", "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-0.0.2.tgz",
@@ -6880,6 +6922,11 @@
"uuid": "dist/bin/uuid" "uuid": "dist/bin/uuid"
} }
}, },
"node_modules/vanilla-tilt": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/vanilla-tilt/-/vanilla-tilt-1.8.1.tgz",
"integrity": "sha512-hPB1XUsnh+SIeVSW2beb5RnuFxz4ZNgxjGD78o52F49gS4xaoLeEMh9qrQnJrnEn/vjjBI7IlxrrXmz4tGV0Kw=="
},
"node_modules/vite": { "node_modules/vite": {
"version": "5.4.1", "version": "5.4.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz",

View File

@@ -21,7 +21,7 @@
"bootstrap": "5.3.3", "bootstrap": "5.3.3",
"chart.js": "^4.4.3", "chart.js": "^4.4.3",
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"framer-motion": "^11.1.5", "framer-motion": "^11.6.0",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"react": "^18.2.0", "react": "^18.2.0",
"react-apexcharts": "^1.4.1", "react-apexcharts": "^1.4.1",
@@ -30,19 +30,21 @@
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-hook-form": "^7.51.3", "react-hook-form": "^7.51.3",
"react-icons": "^5.1.0", "react-icons": "^5.1.0",
"react-phone-input-2": "^2.15.1",
"react-quill": "^0.0.2", "react-quill": "^0.0.2",
"react-redux": "^9.1.1", "react-redux": "^9.1.1",
"react-router-dom": "^6.22.3", "react-router-dom": "^6.22.3",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"redux-persist-transform-encrypt": "^5.1.1", "redux-persist-transform-encrypt": "^5.1.1",
"uuid": "^10.0.0", "uuid": "^10.0.0",
"vanilla-tilt": "^1.8.1",
"xlsx": "^0.18.5", "xlsx": "^0.18.5",
"yup": "^1.4.0" "yup": "^1.4.0"
}, },
"devDependencies": { "devDependencies": {
"@types/react": "^18.2.66", "@types/react": "^18.2.66",
"@types/react-dom": "^18.2.22", "@types/react-dom": "^18.2.22",
"@vitejs/plugin-react-swc": "^3.5.0", "@vitejs/plugin-react-swc": "^3.7.0",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-plugin-react": "^7.34.1", "eslint-plugin-react": "^7.34.1",
"eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-hooks": "^4.6.0",

View File

@@ -168,13 +168,14 @@
.table-scroll::-webkit-scrollbar{ .table-scroll::-webkit-scrollbar{
width: 2px !important; width: 2px !important;
height: 10px !important; height: 5px !important;
} }
/* Total scrollbar width */ /* Total scrollbar width */
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 2px; width: 2px;
height: 12px; height: 12px;
} }
/* The track (background) of the scrollbar */ /* The track (background) of the scrollbar */
@@ -185,14 +186,14 @@
/* The draggable scrollbar handle */ /* The draggable scrollbar handle */
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
background: #0041184f; background: #3f2a7900;
border-radius: 0px; border-radius: 0px;
cursor: grabbing; cursor: grabbing;
} }
/* On hover */ /* On hover */
::-webkit-scrollbar-thumb:hover { ::-webkit-scrollbar-thumb:hover {
background: #0041189a; background: #3f2a799a;
} }
@@ -489,3 +490,11 @@
opacity: 0; opacity: 0;
} }
} }
.react-tel-input .selected-flag:hover, .react-tel-input .selected-flag:focus {
background-color: transparent !important;
}
.react-tel-input .selected-flag {
background: transparent !important;
padding: 0 0 0 16px !important;
}

View File

@@ -56,7 +56,7 @@ const App = () => {
return ( return (
<Router> <Router>
<Routes> <Routes>
<Route path="/login" element={<Login />} /> <Route path="/" element={<Login />} />
<Route path="/forgot-password" element={<ForgotPassword />} /> <Route path="/forgot-password" element={<ForgotPassword />} />
<Route path="/otp-screen" element={<OtpScreen />} /> <Route path="/otp-screen" element={<OtpScreen />} />
<Route path="/otp-screen/:id" element={<OtpScreen />} /> <Route path="/otp-screen/:id" element={<OtpScreen />} />

View File

@@ -22,6 +22,7 @@ const PrimaryButton = ({title, onClick, ...props}) => {
// bgGradient: "linear(to-r, #5E0FCD, #3725EA)", // bgGradient: "linear(to-r, #5E0FCD, #3725EA)",
opacity: 1, opacity: 1,
}} }}
onClick={onClick} onClick={onClick}
>{title}</Button> >{title}</Button>
) )

View File

@@ -96,7 +96,10 @@ const NormalTable = ({
) )
) )
: data?.map((item, index) => ( : data?.map((item, index) => (
<Tr bg={index % 2 === 0 ? "" : "#6311cb14"} key={index}> <Tr cursor={'pointer'}
transition={'0.2s all'}
_hover={{ shadow: "lg" }}
h={12} bg={index % 2 === 0 ? "" : "#6311cb14"} key={index}>
{tableHeadRow.map((heading, i) => ( {tableHeadRow.map((heading, i) => (
<Td <Td
textAlign={ textAlign={

View File

@@ -11,7 +11,7 @@ const EmptySearchList = ({message}) => {
flexDirection={'column'} flexDirection={'column'}
w={"100%"} h={"40vh"} w={"100%"} h={"40vh"}
> >
<Image w={200} mb={8} src={EmptySearchListImage} alt='empty list' /> {/* <Image w={200} mb={8} src={EmptySearchListImage} alt='empty list' /> */}
{/* <Text className=" fw-bold fs-5" >{message}</Text> */} {/* <Text className=" fw-bold fs-5" >{message}</Text> */}
<Text className=" fw-bold fs-5" >We do not have any records</Text> <Text className=" fw-bold fs-5" >We do not have any records</Text>
{/* <Text as={'p'} className="web-text-medium">Posts of tanami will appear here.</Text> */} {/* <Text as={'p'} className="web-text-medium">Posts of tanami will appear here.</Text> */}

View File

@@ -45,12 +45,12 @@ const HeaderMain = ({
w={"100%"} w={"100%"}
h={{ base: "8%", xl: "6%" }} h={{ base: "8%", xl: "6%" }}
position={"relative"} position={"relative"}
className={`pt-2 pb-2 fw-400 d-flex ${ className={`pt-4 pb-4 fw-400 d-flex ${
slideDirecttion ? "ps-2" : "" slideDirecttion ? "ps-2" : ""
} justify-content-between align-items-center`} } justify-content-between align-items-center`}
zIndex={999} zIndex={999}
// bgGradient="linear(to-r, #1A0436, #6311CB)" // Linear gradient // bgGradient="linear(to-r, #1A0436, #6311CB)" // Linear gradient
bgGradient="linear(to-r, #1A0436, #5E0FCD)" bgGradient="linear(to-r, #1A0436, #5E0FCD)"
color={"#fff"} color={"#fff"}
sha sha
> >

View File

@@ -0,0 +1,97 @@
import React, { useEffect, useRef } from 'react'
import logo_card from "../assets/logo_card.svg";
import TRANSCORP_LOGO from "../assets/TRANSCORP_LOGO.svg";
import RuPay from "../assets/rupayImg.png";
import VanillaTilt from 'vanilla-tilt';
import { Box, Text, VStack } from '@chakra-ui/layout';
import { Image } from '@chakra-ui/image';
import { Button } from '@chakra-ui/button';
const PayCard = () => {
const tiltRef = useRef(null); useEffect(() => {
const node = tiltRef.current;
if (node) {
VanillaTilt.init(node, {
max: 5,
speed: 400,
glare: true,
"max-glare": 0.5,
});
}
return () => {
if (node && node.vanillaTilt) {
node.vanillaTilt.destroy();
}
};
}, []);
return (
<VStack
ref={tiltRef} // Attach tilt to this ref
bg="linear-gradient(230deg, purple, #390A74, #390A74, #390A74, #390A74)"
alignItems={"start"}
justifyContent={"space-between"}
height={"100%"}
w={240}
h={"372px"}
rounded={"xl"}
p={4}
boxShadow={"md"}
position={"relative"}
>
<Box
width={"100%"}
cursor={"grab"}
display={"flex"}
justifyContent={"space-between"}
>
<Image w={20} src={logo_card} />
<Image w={24} src={TRANSCORP_LOGO} me={0.5} />
</Box>
<VStack
width={"100%"}
display={"flex"}
alignItems={"start"}
justifyContent={"space-between"}
>
<Text color={"#fff"} fontSize={"sm"}>
1234 5678 1234 5678
</Text>
<Button
size={"sm"}
rounded={"full"}
bg={"#ffffff30"}
fontSize={"sm"}
px={6}
border={"1px solid #fff"}
_hover={{ opacity: 0.8 }}
_active={{ opacity: 1 }}
color={"#fff"}
fontWeight={500}
>
Tap to view details
</Button>
</VStack>
<Box width={"100%"} display={"flex"} justifyContent={"end"}>
{/* <Image w={32} src={logo_card} /> */}
<Image w={24} src={RuPay} me={0.5} />
</Box>
<Text
position={"absolute"}
top={24}
right={-6}
transform="rotate(270deg)"
fontSize={"xs"}
color={"#9E9E9E"}
>
Valid in india
</Text>
</VStack>
)
}
export default PayCard

View File

@@ -1,19 +1,19 @@
import { CheckCircleIcon, WarningIcon } from "@chakra-ui/icons"; import { CheckCircleIcon, WarningIcon } from "@chakra-ui/icons";
import { Box, Text } from "@chakra-ui/react"; import { Box, Text } from "@chakra-ui/react";
import React from "react"; import React from "react";
import { PiWarningBold } from "react-icons/pi";
const ToastBox = ({ message, status }) => { const ToastBox = ({ message, status }) => {
return ( return (
<Box <Box
color="white"
rounded={"sm"}
className="web-text-large d-flex gap-2 align-items-center" className="web-text-large d-flex gap-2 align-items-center"
p={3} p={3}
bg={status === "error" ? "red.500" : status === "warn" ? "yellow.500" : status === "info" ? "blue.500" : "green.500"} color={status === "error" ? "red.500" : status === "warn" ? "blue.500" : "green.500"}
bg={"#fff"}
boxShadow={'md'}
rounded={'md'}
> >
{status === "error" || status === "warn" ? <PiWarningBold/> : status === "info" ? <WarningIcon/> : <CheckCircleIcon /> } {status === "error" || status === "warn" ? <WarningIcon/> : <CheckCircleIcon /> }
<Text as={"span"}>{message}</Text> <Text as={"span"}>{message}</Text>
</Box> </Box>
); );

View File

@@ -299,6 +299,100 @@ const GlobalStateProvider = ({ children }) => {
) )
const [empData, setEmpData] = useState([
{
"EmpId": "145832",
"Name": "Olivia Ipsum",
"EmailAddress": "info@wdimails.com",
"MobileNumber": "+91 ***8451254",
"Grade": "L1",
"Department": "Sales",
"Role": "Sr. Manager",
"Status": "Active",
"Action": "View"
},
{
"EmpId": "145832",
"Name": "Olivia Ipsum",
"EmailAddress": "info@wdimails.com",
"MobileNumber": "+91 ***8451254",
"Grade": "L1",
"Department": "Sales",
"Role": "Sr. Manager",
"Status": "Active",
"Action": "View"
},
{
"EmpId": "145832",
"Name": "Olivia Ipsum",
"EmailAddress": "info@wdimails.com",
"MobileNumber": "+91 ***8451254",
"Grade": "L1",
"Department": "Sales",
"Role": "Sr. Manager",
"Status": "Active",
"Action": "View"
},
{
"EmpId": "145832",
"Name": "Olivia Ipsum",
"EmailAddress": "info@wdimails.com",
"MobileNumber": "+91 ***8451254",
"Grade": "L1",
"Department": "Sales",
"Role": "Sr. Manager",
"Status": "Active",
"Action": "View"
},
{
"EmpId": "145832",
"Name": "Olivia Ipsum",
"EmailAddress": "info@wdimails.com",
"MobileNumber": "+91 ***8451254",
"Grade": "L1",
"Department": "Sales",
"Role": "Sr. Manager",
"Status": "Active",
"Action": "View"
},
{
"EmpId": "145832",
"Name": "Olivia Ipsum",
"EmailAddress": "info@wdimails.com",
"MobileNumber": "+91 ***8451254",
"Grade": "L1",
"Department": "Sales",
"Role": "Sr. Manager",
"Status": "Active",
"Action": "View"
},
{
"EmpId": "145832",
"Name": "Olivia Ipsum",
"EmailAddress": "info@wdimails.com",
"MobileNumber": "+91 ***8451254",
"Grade": "L1",
"Department": "Sales",
"Role": "Sr. Manager",
"Status": "Active",
"Action": "View"
},
{
"EmpId": "145832",
"Name": "Olivia Ipsum",
"EmailAddress": "info@wdimails.com",
"MobileNumber": "+91 ***8451254",
"Grade": "L1",
"Department": "Sales",
"Role": "Sr. Manager",
"Status": "Active",
"Action": "View"
},
]
)
return ( return (
<GlobalStateContext.Provider <GlobalStateContext.Provider
value={{ value={{
@@ -307,7 +401,9 @@ const GlobalStateProvider = ({ children }) => {
requestsTable, requestsTable,
setRequestTable, setRequestTable,
corpData, corpData,
setCorpData setCorpData,
empData,
setEmpData
}} }}
> >
{children} {children}

View File

@@ -8,8 +8,8 @@ import { yupResolver } from "@hookform/resolvers/yup";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { TiWarning } from "react-icons/ti"; import { TiWarning } from "react-icons/ti";
import Loader01 from "../../Components/Loaders/Loader01"; import Loader01 from "../../Components/Loaders/Loader01";
import Asset1 from "../../assets/loginpat.png"; import Asset1 from "../../assets/pattern_white.png";
import logo from "../../assets/optifii_white.svg"; import logo from "../../assets/Whitelogo.svg";
import { import {
Box, Box,
Button, Button,
@@ -261,9 +261,9 @@ const ForgotPassword = () => {
<Image <Image
style={{ style={{
position: "absolute", position: "absolute",
left: 0, left: -100,
bottom: 0, bottom: -120,
width: 350, width: 450,
}} }}
src={Asset1} src={Asset1}
alt="bg-img" alt="bg-img"

View File

@@ -8,8 +8,8 @@ import { yupResolver } from "@hookform/resolvers/yup";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { TiWarning } from "react-icons/ti"; import { TiWarning } from "react-icons/ti";
import Loader01 from "../../Components/Loaders/Loader01"; import Loader01 from "../../Components/Loaders/Loader01";
import Asset1 from "../../assets/loginpat.png"; import Asset1 from "../../assets/pattern_white.png";
import logo from "../../assets/optifii_white.svg"; import logo from "../../assets/Whitelogo.svg";
import { import {
Box, Box,
Button, Button,
@@ -294,9 +294,9 @@ const Login = () => {
<Image <Image
style={{ style={{
position: "absolute", position: "absolute",
left: 0, left: -100,
bottom: 0, bottom: -120,
width: 350, width: 450,
}} }}
src={Asset1} src={Asset1}
alt="bg-img" alt="bg-img"

View File

@@ -8,8 +8,8 @@ import { yupResolver } from "@hookform/resolvers/yup";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { TiWarning } from "react-icons/ti"; import { TiWarning } from "react-icons/ti";
import Loader01 from "../../Components/Loaders/Loader01"; import Loader01 from "../../Components/Loaders/Loader01";
import Asset1 from "../../assets/loginpat.png"; import Asset1 from "../../assets/pattern_white.png";
import logo from "../../assets/optifii_white.svg"; import logo from "../../assets/Whitelogo.svg";
import { import {
Box, Box,
Button, Button,
@@ -34,12 +34,13 @@ import {
useLoginMutation, useLoginMutation,
useResendOtpMutation, useResendOtpMutation,
useResetPasswordMutation, useResetPasswordMutation,
useSetOtpMutation,
} from "../../Services/token.serivce"; } from "../../Services/token.serivce";
import * as Yup from "yup"; import * as Yup from "yup";
import { EmailIcon, PhoneIcon } from "@chakra-ui/icons"; import { EmailIcon, PhoneIcon } from "@chakra-ui/icons";
const OtpScreen = () => { const OtpScreen = () => {
const params = useParams() const params = useParams();
const [show, setShow] = useState(false); const [show, setShow] = useState(false);
const handleClick = () => setShow(!show); const handleClick = () => setShow(!show);
const { isAuthenticate, setIsAuthenticate } = useContext(GlobalStateContext); const { isAuthenticate, setIsAuthenticate } = useContext(GlobalStateContext);
@@ -52,84 +53,111 @@ const OtpScreen = () => {
setPin(value); setPin(value);
}; };
console.log(pin);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const navigate = useNavigate(); const navigate = useNavigate();
const dispatch = useDispatch(); const dispatch = useDispatch();
const [resendPassword] = useResendOtpMutation(); const [resendPassword] = useResendOtpMutation();
const [sendOtp] = useSetOtpMutation();
useEffect(() => { // useEffect(() => {
if (isAuthenticate) { // if (isAuthenticate) {
navigate("/sponser"); // navigate("/sponser");
} // }
}, [navigate, isAuthenticate]); // }, [navigate, isAuthenticate]);
const onSubmit = async (e) => { const onSubmit = async (e) => {
e.preventDefault(); e.preventDefault();
setIsLoading(true); setIsLoading(true);
const data = {
otp: pin,
};
if (params?.id) { if (params?.id) {
// 3-second delay before navigating to "/reset-password"
setTimeout(() => { try {
navigate("/reset-password"); const res = await sendOtp(data);
setIsLoading(false); console.log(res?.error?.data?.message);
}, 3000);
if (res?.statusCode === 200) {
toast({
render: () => (
<ToastBox status={"success"} message={res?.message} />
),
});
navigate("/reset-password");
setIsLoading(false);
} else if (res?.error) {
toast({
render: () => (
<ToastBox
status={"success"}
message={res?.error?.data?.message}
/>
),
});
setIsLoading(false);
}
} catch (error) {console.log(error);}
} else { } else {
// 3-second delay before setting authentication, setting cookies, and navigating try {
setTimeout(() => { const res = await sendOtp(data);
setIsAuthenticate(true); console.log(res);
setIsLoading(false);
Cookies.set("isAuthenticated", true, { expires: 7 }); if (res?.data?.statusCode === 200) {
navigate("/"); console.log("it");
reset(); toast({
}, 3000); render: () => (
<ToastBox status={"success"} message={res?.data?.message} />
),
});
setIsAuthenticate(true);
setIsLoading(false);
Cookies.set("isAuthenticated", true, { expires: 7 });
navigate("/");
} else if (res?.error) {
toast({
render: () => (
<ToastBox status={"error"} message={res?.error?.data?.message} />
),
});
setIsLoading(false);
}
} catch (error) {console.log(error);}
} }
}; };
const handleResendOtp = async () => { const handleResendOtp = async () => {
try {
const res = await resendPassword().unwrap();
console.log(res);
if (res?.statusCode === 200) {
toast({
try { render: () => <ToastBox status={"success"} message={res?.message} />,
const res = await resendPassword().unwrap(); });
console.log(res); } else if (res?.error) {
if (res?.statusCode === 200) { toast({
toast({ render: () => (
render: () => ( <ToastBox status={"success"} message={res?.error?.message} />
<ToastBox status={"success"} message={res?.message} /> ),
), });
}) }
} catch (err) {
}else if(res?.error){ if (err) {
toast({ toast({
render: () => ( render: () => (
<ToastBox status={"success"} message={res?.error?.message} /> <ToastBox status={"error"} message={err?.data?.message} />
), ),
}) });
setIsLoading(false);
}
} }
} catch (err) { };
if (err) {
toast({
render: () => (
<ToastBox status={"error"} message={err?.data?.message} />
),
});
setIsLoading(false);
}
}
}
return ( return (
<Box <Box
@@ -167,7 +195,7 @@ const OtpScreen = () => {
> >
<Box display={"flex"} flexDirection={"column"} gap={0} mb={8}> <Box display={"flex"} flexDirection={"column"} gap={0} mb={8}>
<Text as={"span"} fontSize={"xl"} fontWeight={600}> <Text as={"span"} fontSize={"xl"} fontWeight={600}>
Forgot Password Verify OTP
</Text> </Text>
<Text as={"span"} fontSize={"sm"} fontWeight={400} color={"gray.500"}> <Text as={"span"} fontSize={"sm"} fontWeight={400} color={"gray.500"}>
Enter OTP send to {localStorage?.getItem("email")} Enter OTP send to {localStorage?.getItem("email")}
@@ -175,7 +203,6 @@ const OtpScreen = () => {
</Box> </Box>
<FormControl mb={6}> <FormControl mb={6}>
<HStack justifyContent={"center"}> <HStack justifyContent={"center"}>
<PinInput <PinInput
value={pin} value={pin}
@@ -183,22 +210,27 @@ const OtpScreen = () => {
size="md" size="md"
type="alphanumeric" type="alphanumeric"
mask mask
> >
<PinInputField mx={1} /> <PinInputField mx={1} />
<PinInputField mx={1} /> <PinInputField mx={1} />
<PinInputField mx={1} /> <PinInputField mx={1} />
<PinInputField mx={1} /> <PinInputField mx={1} />
<PinInputField mx={1} /> <PinInputField mx={1} />
<PinInputField mx={1} /> <PinInputField mx={1} />
</PinInput> </PinInput>
</HStack> </HStack>
<HStack
mt={2}
<HStack mt={2} fontWeight={600} fontSize={'xs'} justify={'end'} w={'100%'}> fontWeight={600}
fontSize={"xs"}
justify={"end"}
w={"100%"}
>
{/* <Text>Resend Otp</Text> */} {/* <Text>Resend Otp</Text> */}
<Text onClick={handleResendOtp} cursor={'pointer'}>Resend Otp</Text> <Text onClick={handleResendOtp} cursor={"pointer"}>
Resend Otp
</Text>
</HStack> </HStack>
</FormControl> </FormControl>
@@ -237,12 +269,13 @@ const OtpScreen = () => {
</Text> </Text>
</Box> </Box>
<Image <Image
style={{ style={{
position: "absolute", position: "absolute",
left: 0, left: -100,
bottom: 0, bottom: -120,
width: 350, width: 450,
}} }}
src={Asset1} src={Asset1}
alt="bg-img" alt="bg-img"

View File

@@ -8,8 +8,8 @@ import { yupResolver } from "@hookform/resolvers/yup";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { TiWarning } from "react-icons/ti"; import { TiWarning } from "react-icons/ti";
import Loader01 from "../../Components/Loaders/Loader01"; import Loader01 from "../../Components/Loaders/Loader01";
import Asset1 from "../../assets/loginpat.png"; import Asset1 from "../../assets/pattern_white.png";
import logo from "../../assets/optifii_white.svg"; import logo from "../../assets/Whitelogo.svg";
import { import {
Box, Box,
Button, Button,
@@ -320,9 +320,9 @@ const ResetPassword = () => {
<Image <Image
style={{ style={{
position: "absolute", position: "absolute",
left: 0, left: -100,
bottom: 0, bottom: -120,
width: 350, width: 450,
}} }}
src={Asset1} src={Asset1}
alt="bg-img" alt="bg-img"

View File

@@ -1,4 +1,18 @@
import { Box, Button, HStack, Icon, Input, InputGroup, InputLeftElement, Tag, Text, VStack } from "@chakra-ui/react"; import {
Box,
Button,
HStack,
Icon,
Input,
InputGroup,
InputLeftElement,
Tag,
TagLabel,
TagLeftIcon,
Text,
useDisclosure,
VStack,
} from "@chakra-ui/react";
import { OPACITY_ON_LOAD } from "../../Layout/animations"; import { OPACITY_ON_LOAD } from "../../Layout/animations";
import MiniHeader from "../../Components/MiniHeader"; import MiniHeader from "../../Components/MiniHeader";
import GlobalStateContext from "../../Contexts/GlobalStateContext"; import GlobalStateContext from "../../Contexts/GlobalStateContext";
@@ -10,20 +24,53 @@ import { AiOutlineEdit } from "react-icons/ai";
import { AddIcon, SearchIcon } from "@chakra-ui/icons"; import { AddIcon, SearchIcon } from "@chakra-ui/icons";
import PrimaryButton from "../../Components/Buttons/PrimaryButton"; import PrimaryButton from "../../Components/Buttons/PrimaryButton";
import { GoDotFill } from "react-icons/go"; import { GoDotFill } from "react-icons/go";
import RegisteredCorporateAddNewModal from "./RegisteredCorporateAddNewModal";
import { useNavigate } from "react-router-dom";
import { useGetAllCorpQuery } from "../../Services/register.corporate.service";
export const getStatusColor = (status) => {
switch (status) {
case 1:
return { bg: "blue.100", text: "blue.700", label: "Requested" };
case 2:
return { bg: "yellow.100", text: "yellow.700", label: "Submitted" };
case 3:
return { bg: "purple.100", text: "purple.700", label: "Registered" };
case 4:
return { bg: "green.100", text: "green.700", label: "Approved" };
case 5:
return { bg: "red.100", text: "red.700", label: "Rejected" };
default:
return { bg: "gray.100", text: "gray.700", label: "Unknown" };
}
};
const RegisteredCorporate = () => { const RegisteredCorporate = () => {
const navigate = useNavigate();
const { corpData } = useContext(GlobalStateContext); const { corpData } = useContext(GlobalStateContext);
const [isLoading, setIsLoading] = useState(false);
const [selectedRadio, setSelectedRadio] = useState(""); const [selectedRadio, setSelectedRadio] = useState("");
// Simulate loading effect const { isOpen, onOpen, onClose } = useDisclosure();
useEffect(() => {
setIsLoading(true);
const timer = setTimeout(() => setIsLoading(false), 500);
return () => clearTimeout(timer);
}, []);
console.log(corpData); const [searchTerm, setSearchTerm] = useState("");
const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
// Debounce the search term to avoid making a request on every keystroke
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedSearchTerm(searchTerm);
}, 500); // Adjust delay as needed
return () => {
clearTimeout(handler);
};
}, [searchTerm]);
// Modify the skip condition to always call the API initially
const { data, isLoading } = useGetAllCorpQuery(debouncedSearchTerm, {
skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip only if searchTerm has been cleared after a previous search
});
console.log(data?.data?.rows);
// Table headers // Table headers
const tableHeadRow = [ const tableHeadRow = [
@@ -35,11 +82,10 @@ const RegisteredCorporate = () => {
"Industry", "Industry",
"Type", "Type",
"Subscription", "Subscription",
"Status" "Status",
]; ];
// Extracted data for table // Extracted data for table
const extractedArray = corpData?.map((item, index) => ({ const extractedArray = data?.data?.rows?.map((item, index) => ({
"Corp Id": ( "Corp Id": (
<Text <Text
as={"span"} as={"span"}
@@ -47,23 +93,29 @@ const RegisteredCorporate = () => {
fontSize={"xs"} fontSize={"xs"}
gap={2} gap={2}
alignItems={"center"} alignItems={"center"}
cursor={"pointer"}
// onClick={() => navigate(`/register-corporates/view-corporates/${item.id}`)}
onClick={() => {
navigate(`/register-corporates/view-corporates/${item.id}`);
}}
> >
{item.CorpId} {item?.corporate_code}
</Text>
),
"Company Name": (
<Text
as={"span"}
display={"flex"}
fontSize={"xs"}
gap={2}
alignItems={"center"}
>
{item?.corporate_name}
</Text> </Text>
), ),
"Company Name":
(<Text
as={"span"}
display={"flex"}
fontSize={"xs"}
gap={2}
alignItems={"center"}
>
{item.CompanyName}
</Text>),
"Date Of Onboarding": ( "Date Of Onboarding": (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}> <Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.DateOfOnbaording} {item?.onboarding_date? item?.onboarding_date:"---"}
</Text> </Text>
), ),
// "Email Address": ( // "Email Address": (
@@ -104,83 +156,161 @@ const RegisteredCorporate = () => {
// </HStack> // </HStack>
// ), // ),
"Email Address": ( "Email Address": (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}> <Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.EmailAddress} {item?.emailAddress}
</Text>
),
"Industry": (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.Industry}
</Text>
),
"Type": (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.Type}
</Text>
),
"Subscription": (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.Subscription}
</Text>
),
"Status": (
<Tag bg={index % 2 === 0 ? "green.100" : "#fff"} size="sm">
<GoDotFill color="green"/> <Text
ms={1}
bgGradient="linear(to-l, green.700, green.600)"
bgClip="text"
fontSize={"xs"}
as={"span"}
fontWeight={600}
>
{item.Status}
</Text> </Text>
</Tag>
), ),
Industry: (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.industry_name? item?.industry_name:"---"}
</Text>
),
Type: <Text as={'span'}> {item?.corporate_type?item?.corporate_type:"---"}</Text>,
Subscription: (
<HStack maxH={190} as={"span"} alignItems={"center"} flexWrap={"wrap"}>
{item?.opted_for_expence && (
<Text
fontWeight={600}
as={"span"}
fontSize={"xs"}
py={0.5}
rounded={"md"}
bg={index % 2 === 0 ? "purple.100" : "#fff"}
color={"purple.500"}
px={2}
>
Expence
</Text>
)}
{item?.opted_for_benefit && (
<Text
fontWeight={600}
as={"span"}
fontSize={"xs"}
py={0.5}
rounded={"md"}
bg={index % 2 === 0 ? "purple.100" : "#fff"}
color={"purple.500"}
px={2}
>
Benefits
</Text>
)}
{item?.opted_for_gifting && (
<Text
fontWeight={600}
as={"span"}
fontSize={"xs"}
py={0.5}
rounded={"md"}
bg={index % 2 === 0 ? "purple.100" : "#fff"}
color={"purple.500"}
px={2}
>
Gifting
</Text>
)}
{!item?.opted_for_gifting && !item?.opted_for_gifting && !item?.opted_for_gifting && (
<Text
fontWeight={600}
as={"span"}
fontSize={"xs"}
py={0.5}
rounded={"md"}
bg={index % 2 === 0 ? "purple.100" : "#fff"}
color={"purple.500"}
px={2}
>
---
</Text>
)}
</HStack>
),
Status: (
<Tag
bg={getStatusColor(item?.corporate_status_xid)?.bg}
size="sm"
key={index}
>
<TagLeftIcon
boxSize="12px"
as={GoDotFill}
color={getStatusColor(item?.corporate_status_xid)?.text}
/>
<TagLabel>
<Text
// ms={1}
bgGradient={`linear(to-l, ${
getStatusColor(item?.corporate_status_xid)?.text
}, ${getStatusColor(item?.corporate_status_xid)?.text})`}
bgClip="text"
fontSize="xs"
as="span"
fontWeight={600}
>
{item?.corporate_status}
</Text>
</TagLabel>
</Tag>
),
})); }));
return ( return (
<Box as={"span"} {...OPACITY_ON_LOAD} p={4} pb={3} overflowX={"scroll"}> <Box as={"span"} {...OPACITY_ON_LOAD} p={4} pb={3} overflowX={"scroll"}>
<MiniHeader backButton={true} title={"Manage Registered Corporates"} /> <MiniHeader backButton={true} title={"Manage Registered Corporates"} />
<VStack shadow={'md'} rounded={'md'} gap={3} py={3} bg={'#fff'}> <VStack shadow={"md"} rounded={"md"} gap={3} py={3} bg={"#fff"}>
<HStack px={3} w={'100%'} justifyContent={'space-between'}> <HStack px={3} w={"100%"} justifyContent={"space-between"}>
<Text as={'span'} fontWeight={500} fontSize={'sm'}>Corporates</Text> <Text as={"span"} fontWeight={500} fontSize={"sm"}>
<HStack> Corporates
</Text>
<HStack>
<InputGroup width={350} size="sm" ml={5}> <InputGroup width={350} size="sm" ml={5}>
<InputLeftElement pointerEvents="none"> <InputLeftElement pointerEvents="none">
<SearchIcon color="gray.500" /> <SearchIcon color="gray.500" />
</InputLeftElement> </InputLeftElement>
<Input <Input
type="search" type="search"
placeholder="Search..." placeholder="Search..."
rounded="md" rounded="md"
bg={'gray.100'} bg={"gray.100"}
border={'none'} border={"none"}
// value={searchTerm} value={searchTerm}
// onChange={(e) => setSearchTerm(e.target.value)} onChange={(e) => setSearchTerm(e.target.value)}
/> />
</InputGroup> </InputGroup>
<PrimaryButton title={"Add New"} size={'sm'} leftIcon={<AddIcon fontSize={'xs'}/>}/> <PrimaryButton
</HStack> onClick={onOpen}
title={"Add New"}
size={"sm"}
leftIcon={<AddIcon fontSize={"xs"} />}
/>
{/* Modal is triggered on button click */}
<RegisteredCorporateAddNewModal isOpen={isOpen} onClose={onClose} />
</HStack>
</HStack> </HStack>
<NormalTable <NormalTable
emptyMessage={`We don't have any Sponsors `} emptyMessage={`We don't have any Sponsors `}
tableHeadRow={tableHeadRow} tableHeadRow={tableHeadRow}
data={extractedArray} data={extractedArray}
isLoading={isLoading} isLoading={isLoading}
radio={true} radio={true}
showRadioButton={true} showRadioButton={true}
selectedRadio={selectedRadio} selectedRadio={selectedRadio}
setSelectedRadio={setSelectedRadio} setSelectedRadio={setSelectedRadio}
/> />
</VStack> </VStack>
{/* Modal is triggered on button click */}
<RegisteredCorporateAddNewModal isOpen={isOpen} onClose={onClose} />
</Box> </Box>
); );
}; };

View File

@@ -0,0 +1,227 @@
import React, { useState } from "react";
import {
Box,
Modal,
ModalOverlay,
ModalContent,
ModalHeader,
ModalFooter,
ModalBody,
ModalCloseButton,
Button,
Input,
Text,
HStack,
FormControl,
FormLabel,
FormErrorMessage,
useToast,
} from "@chakra-ui/react";
import { useForm } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
import * as Yup from "yup";
import PrimaryButton from "../../Components/Buttons/PrimaryButton";
import SecondaryButton from "../../Components/Buttons/SecondaryButton";
import RegisteredCorporateAddNewModalSuccessModal from "./RegisteredCorporateAddNewModalSuccessModal";
import PhoneInput from "react-phone-input-2";
import "react-phone-input-2/lib/style.css";
import { useCorporateQuickAddMutation } from "../../Services/register.corporate.service";
import ToastBox from "../../Components/ToastBox";
// Define Yup schema for validation
const validationSchema = Yup.object().shape({
entity_name: Yup.string().required("Entity Name is required"),
corporate_name: Yup.string().required("Company Name is required"),
emailAddress: Yup.string()
.email("Email is invalid")
.required("Email is required"),
mobileNumber: Yup.string().required("Phone number is required"),
ISDcode: Yup.string(),
});
const RegisteredCorporateAddNewModal = ({ isOpen, onClose }) => {
const toast = useToast()
const [isSuccessOpen, setIsSuccessOpen] = useState(false);
const [phone, setPhone] = useState("");
const[ isLoading, setIsLoading ] = useState(false)
const [isdCode, setIsdCode] = useState("");
// Initialize react-hook-form with Yup validation
const {
register,
handleSubmit,
formState: { errors },
setValue,
reset,
} = useForm({
resolver: yupResolver(validationSchema),
});
const [corporateQuickAdd] = useCorporateQuickAddMutation();
const handlePhoneChange = (value, country) => {
const countryCode = `+${country.dialCode}`;
let numberWithoutISD = value;
setPhone(numberWithoutISD);
setValue("mobileNumber", value.split('').splice(countryCode.length - 1, 15).join('')); // Sync phone number
setValue("ISDcode", countryCode); // Sync ISD code
};
// Handle form submission
const onSubmit = async (data) => {
setIsLoading(true)
console.log(data);
try {
const res = await corporateQuickAdd(data)
console.log(res?.data?.data?.link);
if (res?.data?.statusCode === 200) {
toast({
render: () => (
<ToastBox status={"success"} message={res?.data?.message} />
),
})
localStorage?.setItem("link", res?.data?.data?.link)
setIsLoading(false);
setIsSuccessOpen(true); // Open success modal after submission
onClose(); // Close the initial add form modal
reset(); // Reset the form fields
}else if(res?.error){
toast({
render: () => (
<ToastBox status={"error"} message={res?.error?.data?.message} />
),
})
setIsLoading(false);
}
} catch (error) {
}
// Handle the form submission logic here (e.g., send data to the server)
};
const handleSuccessClose = () => {
setIsSuccessOpen(false);
};
return (
<Box>
<Modal isOpen={isOpen} onClose={onClose}>
<ModalOverlay />
<ModalContent>
<ModalHeader>Quick Add</ModalHeader>
<ModalCloseButton />
<ModalBody>
{/* Use handleSubmit from react-hook-form */}
<Box as="form" onSubmit={handleSubmit(onSubmit)}>
<FormControl isInvalid={errors.entity_name} mb={4} isRequired>
<FormLabel
fontSize="xs"
fontWeight={400}
mb={1}
color={"#4F4F4F"}
>
Entity Name
</FormLabel>
<Input fontSize={"xs"} {...register("entity_name")} />
<FormErrorMessage fontSize={"xs"} fontWeight={500} as={"span"}>
{errors.entity_name?.message}
</FormErrorMessage>
</FormControl>
<FormControl isInvalid={errors.corporate_name} mb={4} isRequired>
<FormLabel
fontSize="xs"
fontWeight={400}
mb={1}
color={"#4F4F4F"}
>
Company Name
</FormLabel>
<Input fontSize={"xs"} {...register("corporate_name")} />
<FormErrorMessage fontSize={"xs"} fontWeight={500} as={"span"}>
{errors.corporate_name?.message}
</FormErrorMessage>
</FormControl>
<FormControl isInvalid={errors.emailAddress} mb={4} isRequired>
<FormLabel
fontSize="xs"
fontWeight={400}
mb={1}
color={"#4F4F4F"}
>
Email ID
</FormLabel>
<Input fontSize={"xs"} {...register("emailAddress")} />
<FormErrorMessage fontSize={"xs"} fontWeight={500} as={"span"}>
{errors.emailAddress?.message}
</FormErrorMessage>
</FormControl>
<Box mb={10}>
<Text color={"#4F4F4F"} fontSize={"xs"} fontWeight={500} mb={1}>
Phone Number
</Text>
{/* Handle phone input separately and integrate it with react-hook-form */}
<PhoneInput
country={"in"}
value={phone}
onChange={handlePhoneChange}
inputStyle={{
width: "100%",
borderRadius: "md",
paddingLeft: "8",
border: "1px solid #e2e8f0",
height: "40px",
}}
buttonStyle={{
border: "none",
borderRadius: "8px 0 0 8px",
backgroundColor: "transparent",
}}
/>
{errors.mobileNumber && (
<Text color="red.500" fontSize="xs" fontWeight={500}>
{errors.mobileNumber.message}
</Text>
)}
</Box>
<HStack justifyContent={"center"} spacing={4} my={6}>
<SecondaryButton title={"Cancel"} onClick={onClose} />
<PrimaryButton
isLoading={isLoading}
type="submit" // Change onClick to type="submit" to trigger form submit
title={"Add"}
/>
</HStack>
</Box>
</ModalBody>
</ModalContent>
</Modal>
{/* Success Modal */}
<RegisteredCorporateAddNewModalSuccessModal
isOpen={isSuccessOpen}
onClose={handleSuccessClose}
/>
</Box>
);
};
export default RegisteredCorporateAddNewModal;

View File

@@ -0,0 +1,148 @@
import {
Box,
Modal,
ModalOverlay,
ModalContent,
ModalHeader,
ModalBody,
ModalCloseButton,
Text,
HStack,
Icon,
useToast,
} from "@chakra-ui/react";
import React from "react";
import { motion } from "framer-motion"; // Import motion from framer-motion
import PrimaryButton from "../../Components/Buttons/PrimaryButton";
import { AddIcon } from "@chakra-ui/icons";
import { FaRegCopy } from "react-icons/fa";
import ToastBox from "../../Components/ToastBox";
// Define motion components
const MotionBox = motion(Box);
const MotionSvg = motion.svg;
const MotionCircle = motion.circle;
const MotionPolyline = motion.polyline;
const RegisteredCorporateAddNewModalSuccessModal = ({ isOpen, onClose }) => {
const toast = useToast()
function copyToClipboard(text) {
navigator.clipboard.writeText(text)
.then(() => {
// console.log('Text copied to clipboard');
// alert('Text copied to clipboard');
toast({
render: () => (
<ToastBox status={"warn"} message={"Text copied to clipboard"} />
),
})
})
.catch((err) => {
console.error('Failed to copy text: ', err);
});
}
return (
<Modal isOpen={isOpen} onClose={onClose}>
<ModalOverlay />
<ModalContent>
<ModalHeader></ModalHeader>
<ModalCloseButton />
<ModalBody>
<MotionBox
initial={{ scale: 0.5, opacity: 0 }}
animate={{ scale: 1, opacity: 1 }}
transition={{ duration: 0.5, type: "spring", stiffness: 300 }}
mb={8}
>
{/* svg with Framer Motion animation */}
<HStack justifyContent={"center"} mb={6}>
<MotionSvg
version="1.1"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 130.2 130.2"
width="60px"
height="60px"
initial={{ scale: 0.8 }}
animate={{ scale: 1 }}
transition={{ duration: 0.6, type: "spring", bounce: 0.5 }}
>
<MotionCircle
cx="65.1"
cy="65.1"
r="62.1"
fill="#65F37C"
stroke="#159F2B"
strokeWidth="0"
strokeDasharray="1000"
strokeDashoffset="1000"
initial={{ strokeDashoffset: 1000 }}
animate={{ strokeDashoffset: 0 }}
transition={{ duration: 1 }}
/>
<MotionPolyline
points="100.2,40.2 51.5,88.8 29.8,67.5"
fill="none"
stroke="#159F2B"
strokeWidth="6"
strokeLinecap="round"
strokeMiterlimit="10"
strokeDasharray="1000"
strokeDashoffset="-100"
initial={{ strokeDashoffset: 1000 }}
animate={{ strokeDashoffset: 0 }}
transition={{ duration: 0.7, delay: 1 }}
/>
</MotionSvg>
</HStack>
<Text
color={"#100F14"}
fontSize={"lg"}
fontWeight={"500"}
mb={2}
textAlign={"center"}
>
One More On The List!
</Text>
<Text
color={"#4F4F4F"}
fontSize={"xs"}
fontWeight={"500"}
textAlign={"center"}
mb={10}
>
The Corporate has been added to the List.
</Text>
<Text
color={"#4F4F4F"}
fontSize={"xs"}
fontWeight={"500"}
textAlign={"center"}
>
An email with the onboarding link along with the instruction has been sent has been sent.You can view their onboarding status, by clicking on the button below
</Text>
<HStack position={'relative'} overflowX={'hidden'} w={'100%'}>
<Text
color={"#4F4F4F"}
fontSize={"10px"}
fontWeight={"500"}
textAlign={"start"}>{localStorage?.getItem("link")}</Text>
<Icon bg={'#fff'} p={2} onClick={()=>copyToClipboard(localStorage?.getItem("link"))} position={'absolute'} right={0} bottom={0} boxSize={7} _hover={{bg:"gray.100", transition:"0.5s"}} cursor={'pointer'} rounded={'md'} as={FaRegCopy} />
</HStack>
<HStack justifyContent={"center"} mt={6}>
<PrimaryButton onClick={onClose} title={"Check Application Status"} />
</HStack>
</MotionBox>
</ModalBody>
</ModalContent>
</Modal>
);
};
export default RegisteredCorporateAddNewModalSuccessModal;

View File

@@ -0,0 +1,794 @@
import {
Accordion,
AccordionButton,
AccordionIcon,
AccordionItem,
AccordionPanel,
Badge,
Box,
Button,
Divider,
HStack,
Icon,
Image,
Input,
InputGroup,
InputLeftElement,
List,
ListIcon,
ListItem,
Spinner,
Tag,
TagLabel,
TagLeftIcon,
Text,
useDisclosure,
VStack,
} from "@chakra-ui/react";
import { OPACITY_ON_LOAD } from "../../Layout/animations";
import MiniHeader from "../../Components/MiniHeader";
import GlobalStateContext from "../../Contexts/GlobalStateContext";
import { useContext, useEffect, useState } from "react";
import NormalTable from "../../Components/DataTable/NormalTable";
import { AddIcon, SearchIcon } from "@chakra-ui/icons";
import PrimaryButton from "../../Components/Buttons/PrimaryButton";
import { BsBuildingsFill } from "react-icons/bs";
import { GoDotFill } from "react-icons/go";
import { FiUser } from "react-icons/fi";
import { LuArchive } from "react-icons/lu";
import { GoClock } from "react-icons/go";
import { BsDownload } from "react-icons/bs";
import { FaRegFile } from "react-icons/fa";
import { LuEye } from "react-icons/lu";
import { MdCheckCircle, MdOutlineModeEdit } from "react-icons/md";
import SecondaryButton from "../../Components/Buttons/SecondaryButton";
import pancard from "../../assets/pancard.svg";
import gift from "../../assets/gift.svg";
import { useNavigate, useParams } from "react-router-dom";
import { useGetViewIdQuery } from "../../Services/register.corporate.service";
import { getStatusColor } from "../RegisteredCorporate/RegisteredCorporate";
const DocBox = ({title, imgLink}) =>{
return(<Box
// key={item.id}
bg={"#F4F4F4"}
p={2}
rounded={"md"}
maxW={300}
>
<Box overflow={'hidden'} shadow={"md"} rounded={"md"}>
<Box rounded={"md"} w="100%">
<Image
src={
import.meta.env.VITE_IMAGE_URL +
imgLink
}
alt={title}
width={300}
height={150}
objectFit="cover"
roundedTop={"md"}
/>
</Box>
<HStack
justifyContent={"space-between"}
bg={"#FFFFFF"}
p={2}
roundedBottom={"md"}
>
<Box>
<Text
color={"#1E1E1E"}
fontWeight={500}
fontSize={"sm"}
mb={2}
style={{
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
width: "100%", // or any specific width
}}
>
{title}
</Text>
<Text
color={"#777777"}
fontWeight={400}
fontSize={"xs"}
mb={0}
>
489kb
</Text>
</Box>
<BsDownload
color={"#6311CB"}
fontSize={"16px"}
cursor={"pointer"}
/>
</HStack>
</Box>
</Box>)
}
const ViewCorporates = () => {
const navigate = useNavigate();
const params = useParams();
const id = params?.id;
const { empData } = useContext(GlobalStateContext);
const [isLoading, setIsLoading] = useState(false);
const [selectedRadio, setSelectedRadio] = useState("");
const [getByIdData, setGetByIdData] = useState();
// const { data, isLoading } = useGetViewIdQuery(debouncedSearchTerm, {
// skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip only if searchTerm has been cleared after a previous search
// });
// console.log(data?.data?.rows);
const {
data,
isLoading: corporateLoading,
error,
} = useGetViewIdQuery({ id });
const panCardData = [
{ id: 1, src: pancard, title: "Wdipl PAN. pdf", size: "201 kb" },
{ id: 2, src: pancard, title: "Corporate PAN. pdf", size: "310 kb" },
{ id: 3, src: pancard, title: "Personal PAN. pdf", size: "150 kb" },
];
// Simulate loading effect
useEffect(() => {
setIsLoading(true);
const timer = setTimeout(() => setIsLoading(false), 500);
return () => clearTimeout(timer);
}, []);
// console.log(empData);
// Table headers
const tableHeadRow = [
"Select",
"Emp Id",
"Name",
"Email Address",
"Mobile number",
"Grade",
"Department",
"Role",
"Status",
"Action",
];
// Extracted data for table
const extractedArray = empData?.map((item, index) => ({
"Emp Id": (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.EmpId}
</Text>
),
Name: (
<HStack>
<Image
borderRadius="full"
boxSize="40px"
src="https://bit.ly/dan-abramov"
alt="Dan Abramov"
/>
<Text
as={"span"}
display={"flex"}
fontSize={"xs"}
gap={2}
alignItems={"center"}
>
{item.Name}
</Text>
</HStack>
),
"Email Address": (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.EmailAddress}
</Text>
),
"Mobile number": (
<Text
as={"span"}
display={"flex"}
fontSize={"xs"}
gap={2}
alignItems={"center"}
>
{item.MobileNumber}
</Text>
),
Grade: (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.Grade}
</Text>
),
Department: (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.Department}
</Text>
),
Role: (
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"}>
{item.Role}
</Text>
),
Status: (
<Tag bg={index % 2 === 0 ? "green.100" : "#fff"} size="sm">
<GoDotFill color="green" />{" "}
<Text
ms={1}
bgGradient="linear(to-l, green.700, green.600)"
bgClip="text"
fontSize={"xs"}
as={"span"}
fontWeight={600}
>
{item.Status}
</Text>
</Tag>
),
Action: (
<HStack
onClick={() =>
navigate("/register-corporates/view-corporates-employee-details")
}
>
<LuEye color="#6311CB" />
<Text fontSize={"xs"} as={"span"} colorScheme={"#363636"} mb={0}>
{item.Action}
</Text>
</HStack>
),
}));
return (
corporateLoading ?<Box display={'flex'} justifyContent={'center'} alignItems={'center'} w={'100%'} h={'100vh'}><Spinner color="purple.600"/></Box> :(
<Box as={"span"} {...OPACITY_ON_LOAD} p={4} pb={3} overflowX={"scroll"}>
<MiniHeader backButton={true} title={""} />
<Box roundedTop={"lg"} shadow={"md"} p={4} bg={"#fff"}>
<HStack justifyContent={"space-between"}>
<Box>
<HStack spacing={4} alignItems={"start"}>
<BsBuildingsFill />
<VStack spacing={"1"} alignItems={"start"}>
<Text mb={0} fontSize={"md"} fontWeight={500}>
{data?.data?.corporate_name}
</Text>
<Text fontSize={"sm"} color={"#999999"}>
{/* Limited Liability Partnership (LLP) */}
{data?.data?.corporate_code}
</Text>
</VStack>
{/* <Badge
bg={"#ebf8ef"}
color={"#00A438"}
fontSize={"xs"}
borderRadius={"full"}
fontWeight={400}
py={2}
px={4}
>
<HStack>
<GoDotFill color={"#00A438"} />
<Text mb={0}>Registered</Text>
</HStack>
</Badge> */}
<Tag
bg={getStatusColor(data?.data?.corporate_status_xid)?.bg}
size="sm"
>
<TagLeftIcon
boxSize="12px"
as={GoDotFill}
color={
getStatusColor(data?.data?.corporate_status_xid)?.text
}
/>
<TagLabel>
<Text
// ms={1}
bgGradient={`linear(to-l, ${
getStatusColor(data?.data?.corporate_status_xid)?.text
}, ${
getStatusColor(data?.data?.corporate_status_xid)?.text
})`}
bgClip="text"
fontSize="xs"
as="span"
fontWeight={600}
>
{getStatusColor(data?.data?.corporate_status_xid)?.label}
</Text>
</TagLabel>
</Tag>
</HStack>
</Box>
<HStack>
<PrimaryButton
title={"Edit"}
size={"sm"}
leftIcon={<MdOutlineModeEdit fontSize={"xs"} color="#fff" />}
/>
<SecondaryButton
title={"Archive"}
size={"sm"}
leftIcon={<LuArchive fontSize={"xs"} />}
/>
</HStack>
</HStack>
<Divider />
</Box>
{/* for pink bg */}
<Box bg={"#f4eefb"} py={2} px={4}>
<HStack>
<FiUser fontSize={"xs"} color="#6311CB" />
<Text color={"#1C1C1C"} fontWeight={500} fontSize={"sm"} mb={0}>
User details
</Text>
</HStack>
</Box>
<Box shadow={"md"} p={4} bg={"#fff"}>
<HStack spacing={12}>
<VStack alignItems={"start"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={0}>
Full Name
</Text>
<Text color={"#090909"} fontWeight={500} fontSize={"sm"} mb={0}>
{data?.data?.entity_name}
</Text>
</VStack>
<VStack alignItems={"start"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={0}>
Email address
</Text>
<Text color={"#090909"} fontWeight={500} fontSize={"sm"} mb={0}>
{data?.data?.emailAddress}
</Text>
</VStack>
<VStack alignItems={"start"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={0}>
Phone number
</Text>
<Text color={"#090909"} fontWeight={500} fontSize={"sm"} mb={0}>
{data?.data?.mobileNumber}
</Text>
</VStack>
</HStack>
</Box>
{/* for pink bg */}
<Box bg={"#f4eefb"} py={2} px={4}>
<HStack>
<BsBuildingsFill fontSize={"xs"} color="#6311CB" />
<Text color={"#1C1C1C"} fontWeight={500} fontSize={"sm"} mb={0}>
About company
</Text>
</HStack>
</Box>
<Box shadow={"md"} p={4} bg={"#fff"}>
<HStack spacing={12}>
<VStack alignItems={"start"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={0}>
Company Name
</Text>
<Text color={"#090909"} fontWeight={500} fontSize={"sm"} mb={0}>
{data?.data?.corporate_name}
</Text>
</VStack>
<VStack alignItems={"start"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={0}>
Industry
</Text>
<Text color={"#090909"} fontWeight={500} fontSize={"sm"} mb={0}>
{data?.data?.industry_xid}
</Text>
</VStack>
<VStack alignItems={"start"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={0}>
type
</Text>
<Text color={"#090909"} fontWeight={500} fontSize={"sm"} mb={0}>
{data?.data?.corporate_type_xid}
</Text>
</VStack>
</HStack>
</Box>
{/* for pink bg */}
<Box bg={"#f4eefb"} py={2} px={4}>
<HStack>
<BsBuildingsFill fontSize={"xs"} color="#6311CB" />
<Text color={"#1C1C1C"} fontWeight={500} fontSize={"sm"} mb={0}>
Company Details
</Text>
</HStack>
</Box>
<Box shadow={"md"} p={4} bg={"#fff"}>
<HStack spacing={12} mb={6}>
<VStack alignItems={"start"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={0}>
CIN
</Text>
<Text color={"#090909"} fontWeight={500} fontSize={"sm"} mb={0}>
{data?.data?.other_details?.cin_number}
</Text>
</VStack>
<VStack alignItems={"start"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={0}>
Company GST number
</Text>
<Text color={"#090909"} fontWeight={500} fontSize={"sm"} mb={0}>
{data?.data?.other_details?.gst_number}
</Text>
</VStack>
</HStack>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={4}>
Documentsss
</Text>
<HStack spacing={4} wrap="wrap">
<DocBox title={data?.data?.other_details?.corporate_pancard_file_path_name?.split("/").pop()} imgLink={import.meta.env.VITE_IMAGE_URL +
data?.data?.other_details?.corporate_pancard_file_path_name} />
<DocBox title={data?.data?.other_details?.corporate_pancard_file_path_name?.split("/").pop()} imgLink={import.meta.env.VITE_IMAGE_URL +
data?.data?.other_details?.corporate_pancard_file_path_name} />
</HStack>
</Box>
{/* for pink bg */}
<Box bg={"#f4eefb"} py={2} px={4}>
<HStack>
<BsBuildingsFill fontSize={"xs"} color="#6311CB" />
<Text color={"#1C1C1C"} fontWeight={500} fontSize={"sm"} mb={0}>
Director Details
</Text>
</HStack>
</Box>
<Box shadow={"md"} p={4} bg={"#fff"}>
{data?.data?.director?.map(
(
{
director_name,
emailAddress,
mobileNumber,
pancard_file_path_name,
aadhar_file_path_name,
ISDCode,
},
index
) => (
<>
<Text color={"#090909"} fontWeight={500} fontSize={"sm"}>
Director {index + 1}
</Text>
<HStack spacing={12} mb={6}>
<VStack alignItems={"start"}>
<Text
color={"#777777"}
fontWeight={400}
fontSize={"xs"}
mb={0}
>
Full Name
</Text>
<Text
color={"#090909"}
fontWeight={500}
fontSize={"sm"}
mb={0}
>
{director_name}
</Text>
</VStack>
<VStack alignItems={"start"}>
<Text
color={"#777777"}
fontWeight={400}
fontSize={"xs"}
mb={0}
>
Email address
</Text>
<Text
color={"#090909"}
fontWeight={500}
fontSize={"sm"}
mb={0}
>
{emailAddress}
</Text>
</VStack>
<VStack alignItems={"start"}>
<Text
color={"#777777"}
fontWeight={400}
fontSize={"xs"}
mb={0}
>
Phone number
</Text>
<Text
color={"#090909"}
fontWeight={500}
fontSize={"sm"}
mb={0}
>
+{mobileNumber}
</Text>
</VStack>
</HStack>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={4}>
Documents
</Text>
<HStack spacing={4} wrap="wrap">
<DocBox title={pancard_file_path_name?.split("/").pop()} imgLink={pancard_file_path_name} />
<DocBox title={aadhar_file_path_name?.split("/").pop()} imgLink={aadhar_file_path_name} />
</HStack>
<Divider />
</>
)
)}
</Box>
{/* for pink bg */}
<Box bg={"#f4eefb"} py={2} px={4}>
<HStack>
<BsBuildingsFill fontSize={"xs"} color="#6311CB" />
<Text color={"#1C1C1C"} fontWeight={500} fontSize={"sm"} mb={0}>
Package selected
</Text>
</HStack>
</Box>
<Box roundedBottom={"lg"} shadow={"md"} p={4} bg={"#fff"}>
<HStack spacing={6}>
<Box bg={"#f7f6fe"} p={4} rounded={"md"}>
<HStack justifyContent={"space-between"} mb={4}>
<HStack>
<Image src={gift}></Image>
<Text
color={"#393939"}
fontWeight={500}
fontSize={"sm"}
mb={0}
>
OptiFii Benefit
</Text>
</HStack>
<HStack>
<GoClock size={16} color={"#00A438"} />
<Text
color={"#00A438"}
fontWeight={400}
fontSize={"xs"}
mb={0}
>
Renewal in 30 days
</Text>
</HStack>
</HStack>
<Text color={"#6F8196"} fontWeight={400} fontSize={"sm"} mb={8}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut et
massa mi.
</Text>
<HStack spacing={4}>
<List spacing={3} pl={0}>
<ListItem display={"flex"} gap={0}>
<ListIcon
as={MdCheckCircle}
color="#3725EA"
fontSize={"lg"}
/>
<Text color={"#585858"} fontSize={"xs"}>
Lorem ipsum dolor sit amet, consectetur adipisicing elit
</Text>
</ListItem>
<ListItem display={"flex"} gap={0}>
<ListIcon
as={MdCheckCircle}
color="#3725EA"
fontSize={"lg"}
/>
<Text color={"#585858"} fontSize={"xs"}>
Lorem ipsum dolor sit amet, consectetur adipisicing elit
</Text>
</ListItem>
</List>
<List spacing={3} pl={0}>
<ListItem display={"flex"} gap={0}>
<ListIcon
as={MdCheckCircle}
color="#3725EA"
fontSize={"lg"}
/>
<Text color={"#585858"} fontSize={"xs"}>
Lorem ipsum dolor sit amet, consectetur adipisicing elit
</Text>
</ListItem>
<ListItem display={"flex"} gap={0}>
<ListIcon
as={MdCheckCircle}
color="#3725EA"
fontSize={"lg"}
/>
<Text color={"#585858"} fontSize={"xs"}>
Lorem ipsum dolor sit amet, consectetur adipisicing elit
</Text>
</ListItem>
</List>
</HStack>
</Box>
<Box bg={"#f7f6fe"} p={4} rounded={"md"}>
<HStack justifyContent={"space-between"} mb={4}>
<HStack>
<Image src={gift}></Image>
<Text
color={"#393939"}
fontWeight={500}
fontSize={"sm"}
mb={0}
>
OptiFii Benefit
</Text>
</HStack>
<HStack>
<GoClock size={16} color={"#00A438"} />
<Text
color={"#00A438"}
fontWeight={400}
fontSize={"xs"}
mb={0}
>
Renewal in 30 days
</Text>
</HStack>
</HStack>
<Text color={"#6F8196"} fontWeight={400} fontSize={"sm"} mb={8}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut et
massa mi.
</Text>
<HStack spacing={4}>
<List spacing={3} pl={0}>
<ListItem display={"flex"} gap={0}>
<ListIcon
as={MdCheckCircle}
color="#3725EA"
fontSize={"lg"}
/>
<Text color={"#585858"} fontSize={"xs"}>
Lorem ipsum dolor sit amet, consectetur adipisicing elit
</Text>
</ListItem>
<ListItem display={"flex"} gap={0}>
<ListIcon
as={MdCheckCircle}
color="#3725EA"
fontSize={"lg"}
/>
<Text color={"#585858"} fontSize={"xs"}>
Lorem ipsum dolor sit amet, consectetur adipisicing elit
</Text>
</ListItem>
</List>
<List spacing={3} pl={0}>
<ListItem display={"flex"} gap={0}>
<ListIcon
as={MdCheckCircle}
color="#3725EA"
fontSize={"lg"}
/>
<Text color={"#585858"} fontSize={"xs"}>
Lorem ipsum dolor sit amet, consectetur adipisicing elit
</Text>
</ListItem>
<ListItem display={"flex"} gap={0}>
<ListIcon
as={MdCheckCircle}
color="#3725EA"
fontSize={"lg"}
/>
<Text color={"#585858"} fontSize={"xs"}>
Lorem ipsum dolor sit amet, consectetur adipisicing elit
</Text>
</ListItem>
</List>
</HStack>
</Box>
</HStack>
<Box />
</Box>
<Box rounded={"lg"} mt={4} shadow={"md"} py={2} bg={"#fff"}>
<Accordion allowMultiple>
<AccordionItem border={"none"}>
<Text mb={0}>
<AccordionButton py={2}>
<Box as="span" flex="1" textAlign="left">
<HStack>
<FaRegFile color="#6311CB" />
<Text fontWeight={500} fontSize={"sm"} mb={0}>
Employee list
</Text>
</HStack>
</Box>
<AccordionIcon
bg={"#f4eefb"}
rounded={"full"}
color={"#6311CB"}
/>
</AccordionButton>
</Text>
<AccordionPanel pb={4}>
{/* table knvfidem */}
<VStack gap={3} py={3} bg={"#fff"}>
<HStack px={3} w={"100%"} justifyContent={"space-between"}>
<Text as={"span"} fontWeight={500} fontSize={"sm"}>
Corporates
</Text>
<HStack>
<InputGroup width={350} size="sm" ml={5}>
<InputLeftElement pointerEvents="none">
<SearchIcon color="gray.500" />
</InputLeftElement>
<Input
type="search"
placeholder="Search..."
rounded="md"
bg={"gray.100"}
border={"none"}
// value={searchTerm}
// onChange={(e) => setSearchTerm(e.target.value)}
/>
</InputGroup>
</HStack>
</HStack>
<NormalTable
emptyMessage={`We don't have any Sponsors `}
tableHeadRow={tableHeadRow}
data={extractedArray}
isLoading={isLoading}
radio={true}
showRadioButton={true}
selectedRadio={selectedRadio}
setSelectedRadio={setSelectedRadio}
/>
</VStack>
</AccordionPanel>
</AccordionItem>
</Accordion>
</Box>
</Box>
)
);
};
export default ViewCorporates;

View File

@@ -0,0 +1,149 @@
import { Badge, Box, HStack, Image, Tab, TabList, TabPanel, TabPanels, Tabs, Text, VStack } from '@chakra-ui/react'
import React from 'react'
import { OPACITY_ON_LOAD } from '../../Layout/animations'
import MiniHeader from '../../Components/MiniHeader'
import { BsBuildingsFill } from 'react-icons/bs'
import { GoDotFill } from 'react-icons/go'
import PayCard from '../../Components/PayCard'
const ViewCorporatesEmployeeDetails = () => {
return (
<Box as={"span"} {...OPACITY_ON_LOAD} p={4} pb={3} overflowX={"scroll"}>
<MiniHeader backButton={true} title={""} />
<Box shadow={'md'} p={4} bg={'#fff'} rounded={"md"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={4}>
Employee Details
</Text>
<HStack spacing={6} alignItems={"start"}>
<HStack spacing={4} alignItems={"start"}>
<Image
borderRadius='full'
boxSize='80px'
src='https://bit.ly/dan-abramov'
alt='Dan Abramov'
/>
<VStack spacing={"1"} alignItems={"start"}>
<Text mb={0} fontSize={"md"} fontWeight={500}>
Pooja Shah
</Text>
<Text fontSize={"xs"} color={"#999999"} mb={0}>Design - UI/UX Designer</Text>
<Text mb={0} fontSize={"xs"} fontWeight={500}>
Employee ID : WD-0067
</Text>
<Text fontSize={"xs"} color={"#999999"}>Member Since : 1st Jan 2022</Text>
</VStack>
<Badge
bg={"#ebf8ef"}
color={"#00A438"}
fontSize={"xs"}
borderRadius={"full"}
fontWeight={400}
py={2}
px={4}
>
<HStack>
<GoDotFill color={"#00A438"} />
<Text mb={0}>Active</Text>
</HStack>
</Badge>
</HStack>
<Box
borderLeft="1px dashed #BCBCBC"
pl={6}
>
<HStack mb={2}>
<Text fontSize={"xs"} color={"#999999"} mb={0}>Phone :</Text>
<Text mb={0} fontSize={"xs"} fontWeight={500}>
+91 4578451245
</Text>
</HStack>
<HStack mb={2}>
<Text fontSize={"xs"} color={"#999999"} mb={0}>Email :</Text>
<Text mb={0} fontSize={"xs"} fontWeight={500}>
poojashah@wdipl.com
</Text>
</HStack>
<HStack>
<Text fontSize={"xs"} color={"#999999"} mb={0}>Grade :</Text>
<Text mb={0} fontSize={"xs"} fontWeight={500}>
A01
</Text>
</HStack>
</Box>
</HStack>
</Box>
<HStack spacing={4} w={"100%"} alignItems={"start"} mt={4}>
<Box shadow={'md'} p={4} bg={'#fff'} rounded={"md"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={4}>
Card Details
</Text>
<HStack spacing={6} alignItems={"start"}>
<HStack spacing={8} alignItems={"center"}>
<PayCard />
<VStack alignItems={"start"} spacing={10}>
<Box>
<Text fontSize={"sm"} color={"#999999"} mb={1}>Card ID</Text>
<Text mb={0} fontSize={"sm"} fontWeight={500}>
0067445
</Text>
</Box>
<Box>
<Text fontSize={"sm"} color={"#999999"} mb={1}>Card limit</Text>
<Text mb={0} fontSize={"sm"} fontWeight={500}>
10,000
</Text>
</Box>
<Box>
<Text fontSize={"sm"} color={"#999999"} mb={1}>Card type</Text>
<Text mb={0} fontSize={"sm"} fontWeight={500}>
Reloadable
</Text>
</Box>
</VStack>
</HStack>
</HStack>
</Box>
<Box shadow={'md'} p={4} bg={'#fff'} rounded={"md"}>
<Text color={"#777777"} fontWeight={400} fontSize={"xs"} mb={4}>
Wallets
</Text>
<Box>
<Tabs>
<TabList>
<Tab>Expense</Tab>
<Tab>Benefit</Tab>
<Tab>Gift & reward</Tab>
</TabList>
<TabPanels>
<TabPanel>
<p>one!</p>
</TabPanel>
<TabPanel>
<p>two!</p>
</TabPanel>
<TabPanel>
<p>three!</p>
</TabPanel>
</TabPanels>
</Tabs>
</Box>
</Box>
</HStack>
</Box>
)
}
export default ViewCorporatesEmployeeDetails

View File

@@ -1,8 +1,12 @@
import NotFound from "../Pages/NotFound"; import NotFound from "../Pages/NotFound";
import RegisteredCorporate from "../Pages/RegisteredCorporate/RegisteredCorporate"; import RegisteredCorporate from "../Pages/RegisteredCorporate/RegisteredCorporate";
import ViewCorporates from "../Pages/ViewCorporates/ViewCorporates";
import ViewCorporatesEmployeeDetails from "../Pages/ViewCorporates/ViewCorporatesEmployeeDetails";
export const RouteLink = [ export const RouteLink = [
{ path: "/", Component: NotFound }, { path: "/", Component: NotFound },
{ path: "/register-corporates", Component: RegisteredCorporate }, { path: "/register-corporates", Component: RegisteredCorporate },
{ path: "/register-corporates/view-corporates/:id", Component: ViewCorporates },
{ path: "/register-corporates/view-corporates-employee-details", Component: ViewCorporatesEmployeeDetails },
]; ];

View File

@@ -1,42 +0,0 @@
// io.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
export const keyMerits = createApi({
reducerPath: "ioService",
baseQuery: baseQuery,
tagTypes: ["getKeyMerits"],
endpoints: (builder) => ({
// =====[get]
getKeyMerits: builder.query({
query: (id) => `/io/admin/key-merits/${id}`,
providesTags: ["getKeyMerits"],
}),
setDisplayOrder: builder.mutation({
query: ({ data }) => ({
url: `/io/admin/key-merits/resetDisplayOrder`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
}),
});
// Export hooks for usage in functional components
export const {
useGetKeyMeritsQuery,
useSetDisplayOrderMutation
} =
keyMerits;

View File

@@ -1,47 +0,0 @@
// investorDetails.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
// Define a service using a base URL and expected endpoints
export const banInvestorDetails = createApi({
reducerPath: "banInvestorDetails",
baseQuery: baseQuery,
tagTypes: ["getBanInvestor", "getUnbanInvestor"],
endpoints: (builder) => ({
getInvestor: builder.query({
query: () => `/investorDetails/admin`,
providesTags: ["getBanInvestor"],
}),
getUnbanInvestor: builder.query({
query: () => `/investorDetails/admin/getAllUnbanned`,
providesTags: ["getBanInvestor"],
}),
getbanInvestor: builder.query({
query: () => `/investorDetails/admin/getAllBanned`,
providesTags: ["getBanInvestor"],
}),
updateUnban: builder.mutation({
query: ({ id, data }) => ({
url: `/investorDetails/admin/unBanById/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getBanInvestor"],
}),
}),
});
// Export hooks for usage in functional components
export const {
useGetUnbanInvestorQuery,
useGetInvestorQuery,
useGetbanInvestorQuery,
useUpdateUnbanMutation,
} = banInvestorDetails;

View File

@@ -1,43 +0,0 @@
// investorDetails.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
// Define a service using a base URL and expected endpoints
export const bankDetails = createApi({
reducerPath: "bankDetails",
baseQuery: baseQuery,
tagTypes: ["getBank"],
endpoints: (builder) => ({
getBank: builder.query({
query: ({ page, size }) =>
`/bankDetails/admin/?page=${page}&size=${size}`,
providesTags: ["getBank"],
}),
updateBankDetails: builder.mutation({
query: ({ data, id }) => ({
url: `/bankDetails/admin/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getBank"],
}),
getBankDetails: builder.query({
query: ({ data, id }) => ({
url: `/bankDetails/admin/${id}`,
method: "GET",
body: data,
}),
invalidatesTags: ["getBank"],
}),
}),
});
// Export hooks for usage in functional components
export const { useGetBankQuery, useUpdateBankDetailsMutation,useGetBankDetailsQuery } = bankDetails;

View File

@@ -1,37 +0,0 @@
// investorDetails.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
// Define a service using a base URL and expected endpoints
export const contact = createApi({
reducerPath: "contact",
baseQuery: baseQuery,
tagTypes: ["getContact"],
endpoints: (builder) => ({
getContact: builder.query({
query: () =>
`/contactDetails/admin`,
providesTags: ["getContact"],
}),
// ========[Update Investment]=======
updateContact: builder.mutation({
query: (data) => ({
url: `/contactDetails/admin/`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getContact"],
}),
}),
});
// Export hooks for usage in functional components
export const { useGetContactQuery, useUpdateContactMutation } = contact;

View File

@@ -1,57 +0,0 @@
// investorDetails.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
// Define a service using a base URL and expected endpoints
export const deleteRequest = createApi({
reducerPath: "deleteRequest",
baseQuery: baseQuery,
tagTypes: ["getDeleteRequest", "getDeleteHistory"],
endpoints: (builder) => ({
getDeleteRequest: builder.query({
query: () => `/account/admin/pending-request`,
providesTags: ["getDepositRequest"],
}),
getDeleteRequestById: builder.query({
query: (id) => `/account/admin/detail/${id}`,
}),
approveDepositRequest: builder.mutation({
query: ({ id, data }) => ({
url: `/account/admin/approved-request/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getDeleteRequest", "getDeleteHistory"],
}),
deleteReject: builder.mutation({
query: ({ id, data }) => ({
url: `/deposit/admin/rejected/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getDeleteRequest", "getDeleteHistory"],
}),
getDeleteHistory: builder.query({
query: () => `/account/admin/history`,
providesTags: ["getDeleteHistory"],
}),
}),
});
// Export hooks for usage in functional components
export const {
useGetDeleteRequestQuery,
useGetDeleteRequestByIdQuery,
useApproveDepositRequestMutation,
useGetDeleteHistoryQuery
} = deleteRequest;

View File

@@ -1,55 +0,0 @@
// investorDetails.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
// Define a service using a base URL and expected endpoints
export const depositRequest = createApi({
reducerPath: "depositRequest",
baseQuery: baseQuery,
tagTypes: ["getDepositRequest", "getDepositHistory"],
endpoints: (builder) => ({
getDepositRequest: builder.query({
query: ({page, size}) => `/deposit/admin/pending-requests?page=${page}&size=${size}`,
providesTags: ["getDepositRequest"],
}),
getDepositRequestById: builder.query({
query: (id) => `/deposit/admin/getById/${id}`,
}),
updateDepositRequest: builder.mutation({
query: ({ id, data }) => ({
url: `/deposit/admin/approved/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getDepositRequest", "getDepositHistory"],
}),
depositReject: builder.mutation({
query: ({ id, data }) => ({
url: `/deposit/admin/rejected/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getDepositRequest", "getDepositHistory"],
}),
getDepositHistory: builder.query({
query: ({page, size}) => `/deposit/admin/history?page=${page}&size=${size}`,
providesTags: ["getDepositHistory"],
}),
}),
});
// Export hooks for usage in functional components
export const {
useGetDepositRequestQuery,
useGetDepositRequestByIdQuery,
useUpdateDepositRequestMutation,
useDepositRejectMutation,
useGetDepositHistoryQuery,
} = depositRequest;

View File

@@ -1,101 +0,0 @@
//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";
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 deposite = createApi({
reducerPath: "deposite",
baseQuery: fetchBaseQuery({ baseUrl: baseUrl }),
tagTypes: ["gtDeposite"],
endpoints: (builder) => ({
// ======[Get All]=====
getSponserMaster: builder.query({
query: ({ page, size }) => `/sponsor/admin?page=${page}&size=${size}`,
providesTags: ["getSponser"],
}),
// ========[Get Active]========
getActiveSponserMaster: builder.query({
query: () => `/sponsor/admin/active`,
providesTags: ["getSponser"],
}),
getSponserMasterActive: builder.query({
query: () => "/sponsor/admin/active",
}),
// ======[Get ID]=====
getSponserById: builder.query({
query: (id) => `/sponsor/admin/${id}`,
providesTags: ["getSponser"],
}),
// ========[Toggle Status]========
toggleStatus: builder.mutation({
query: ({ id }) => ({
url: `/sponsor/admin/toggle-status/${id}`,
method: "PATCH",
}),
invalidatesTags: ["getSponser"],
}),
// ========[Create Sponser]========
createSponser: builder.mutation({
query: (data) => ({
url: `/sponsor/admin`,
method: "POST",
body: data,
}),
invalidatesTags: ["getSponser"],
}),
// ========[Update Sponser]========
updateSponser: builder.mutation({
query: ({ data, id }) => ({
url: `/sponsor/admin/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getSponser"],
}),
// ========[Delete Sponser]========
deleteSponser: builder.mutation({
query: (id) => ({
url: `/sponsor/admin/delete/${id}`,
method: "DELETE",
}),
invalidatesTags: ["getSponser"],
}),
}),
});
// Export hooks for usage in functional components
export const {
useGetSponserMasterQuery,
useGetSponserMasterActiveQuery,
useToggleStatusMutation,
useCreateSponserMutation,
useUpdateSponserMutation,
useGetSponserByIdQuery,
useDeleteSponserMutation,
useGetActiveSponserMasterQuery
} = sponserMaster;

View File

@@ -1,56 +0,0 @@
// investorDetails.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
// Define a service using a base URL and expected endpoints
export const drawalRequest = createApi({
reducerPath: "drawalRequest",
baseQuery: baseQuery,
tagTypes: ["getDrawalRequest", "getDepositHistory"],
endpoints: (builder) => ({
getDrawalRequest: builder.query({
query: () => `/withdrawal/admin`,
providesTags: ["getDrawalRequest"],
}),
getDrawalRequestById: builder.query({
query: (id) => `/withdrawal/admin/getById/${id}`,
}),
updateDrawalRequest: builder.mutation({
query: ({ id, data }) => ({
url: `/withdrawal/admin/updateApprove/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getDrawalRequest", "getDepositHistory"],
}),
depositReject: builder.mutation({
query: ({ id, data }) => ({
url: `/deposit/admin/rejected/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getDepositRequest", "getDepositHistory"],
}),
getDrawalHistory: builder.query({
query: () => `/withdrawal/admin/history`,
providesTags: ["getDepositHistory"],
}),
}),
});
// Export hooks for usage in functional components
export const {
useGetDrawalRequestQuery,
useUpdateDrawalRequestMutation,
useGetDrawalRequestByIdQuery,
useDepositRejectMutation,
useGetDrawalHistoryQuery
} = drawalRequest;

View File

@@ -1,49 +0,0 @@
// exchangeRate.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
// Define a service using a base URL and expected endpoints
export const exchangeRate = createApi({
reducerPath: "exchangeRate",
baseQuery: baseQuery,
tagTypes: ["getAllExchangeRate", "getExchangeById"],
endpoints: (builder) => ({
getAllExchangeRates: builder.query({
query: ({ page, size }) =>
`/currencyExchange/admin?page=${page}&size=${size}`,
providesTags: ["getAllExchangeRate"],
}),
getExchangeRateById: builder.query({
query: (id) => `/currencyExchange/admin/${id}`,
providesTags: ["getExchangeById"],
}),
updateExchangeRate: builder.mutation({
query: ({ data, id }) => ({
url: `/currencyExchange/admin/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getAllExchangeRate"],
}),
getCurrencyHistoryById: builder.query({
query: (id) => `/currencyExchange/admin/history/${id}`,
providesTags: ["getAllExchangeRate"],
}),
}),
});
// Export hooks for usage in functional components
export const {
useGetAllExchangeRatesQuery,
useGetExchangeRateByIdQuery,
useUpdateExchangeRateMutation,
useGetCurrencyHistoryByIdQuery,
} = exchangeRate;

View File

@@ -1,61 +0,0 @@
// io.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
export const ioService = createApi({
reducerPath: "ioService",
baseQuery: baseQuery,
tagTypes: ["getInvestmentDocuments"],
endpoints: (builder) => ({
// =====[get]
getInvestmentDocuments: builder.query({
query: ({id}) => `/io/admin/document/${id}`,
providesTags: ["getInvestmentDocuments"],
}),
// =====[create]
createInvestmentDocuments: builder.mutation({
query: ({data, id}) => ({
url: `/io/admin/document/${id}`,
method: "POST",
body: data,
}),
invalidatesTags: ["getInvestmentDocuments"],
}),
updateIO: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getInvestmentDocuments"],
}),
}),
});
// Export hooks for usage in functional components
export const {
useCreateInvestmentDocumentsMutation,
} =
ioService;

View File

@@ -1,72 +0,0 @@
// // investmentType.service.js
// import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// // import { api } from "./api.service";
// import { baseQuery } from "./token.serivce";
// // const baseUrl = api?.defaults.baseURL;
// // Define a service using a base URL and expected endpoints
// export const investmentType = createApi({
// reducerPath: "investmentType",
// baseQuery: baseQuery,
// tagTypes: ["getInvestmentType", "getInvestmentTypeID"],
// endpoints: (builder) => ({
// // ========[Get All]=========
// getInvestmentTypes: builder.query({
// query: ({ page, size }) =>
// `/investmentType/admin?page=${page}&size=${size}`,
// providesTags: ["getInvestmentType"],
// }),
// // ========[Get ID]=========
// getInvestmentTypeById: builder.query({
// query: (id) => `/investmentType/admin/${id}`,
// providesTags: ["getInvestmentTypeID"],
// }),
// // ========[Create Investment]========
// createInvestmentType: builder.mutation({
// query: (data) => ({
// url: `/investmentType/admin/`,
// method: "POST",
// body: data,
// }),
// invalidatesTags: ["getInvestmentType"],
// }),
// // ========[Update Investment]=======
// updateInvestmentType: builder.mutation({
// query: ({ data, id }) => ({
// url: `/investmentType/admin/${id}`,
// method: "PATCH",
// body: data,
// }),
// invalidatesTags: ["getInvestmentTypeID", "getInvestmentType"],
// }),
// // ========[Delete Investment]=======
// deleteInvestmentType: builder.mutation({
// query: (id) => ({
// url: `/investmentType/admin/delete/${id}`,
// method: "DELETE",
// }),
// invalidatesTags: ["getInvestmentType"],
// }),
// }),
// });
// // Export hooks for usage in functional components
// export const {
// useGetInvestmentTypesQuery,
// useGetInvestmentTypeByIdQuery,
// useCreateInvestmentTypeMutation,
// useUpdateInvestmentTypeMutation,
// useDeleteInvestmentTypeMutation,
// } = investmentType;

View File

@@ -1,42 +0,0 @@
// investorDetails.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
// Define a service using a base URL and expected endpoints
export const investorDetails = createApi({
reducerPath: "investorDetails",
baseQuery: baseQuery,
tagTypes: [],
endpoints: (builder) => ({
getInvestors: builder.query({
query: ({ page, size }) =>
`/investorDetails/admin?page=${page}&size=${size}`,
providesTags: ["getInvestors"],
}),
// =====[get investment details ]
getInvestorsDetailsById: builder.query({
query: (id) => `/investorDetails/admin/byId/${id}`,
providesTags: ["getInvestors"],
}),
// =====[get investment details ]
getInvestorsDetailsById_InInvCur: builder.query({
query: ({ id, currencyIn }) =>
currencyIn
? `/investorDetails/admin/byId/${id}?currencyIn=InvCur`
: `/investorDetails/admin/byId/${id}`,
providesTags: ["getInvestors"],
}),
}),
});
// Export hooks for usage in functional components
export const {
useGetInvestorsQuery,
useGetInvestorsDetailsByIdQuery,
useGetInvestorsDetailsById_InInvCurQuery,
} = investorDetails;

View File

@@ -1,23 +0,0 @@
// 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";
// Define a service using a base URL and expected endpoints
export const investorTransaction = createApi({
reducerPath: "investorTransaction",
baseQuery: baseQuery,
tagTypes: [],
endpoints: (builder) => ({
getTransactions: builder.query({
query: () => '/getTransactions',
}),
getTransactionById: builder.query({
query: (id) => `/getTransaction/${id}`,
}),
}),
});
// Export hooks for usage in functional components
export const { useGetTransactionsQuery, useGetTransactionByIdQuery } = investorTransaction;

View File

@@ -1,493 +0,0 @@
// io.service.js
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
// Define a service using a base URL and expected endpoints
export const ioService = createApi({
reducerPath: "ioService",
baseQuery: baseQuery,
tagTypes: [
"prePopulate",
"getIO",
"getKeyMerits",
"getArtifactsVideo",
"getInvestmentDocuments",
"getIOById",
"getSponser",
"getInvestmentType",
"getInvestmentTypeID"
],
endpoints: (builder) => ({
// =====[get prepopulate data]
getIOprepopulateData: builder.query({
query: () => `/io/admin/pre-populate`,
providesTags: ["prePopulate"],
}),
// =====[get]
getIOs: builder.query({
query: ({ page, size }) => `/io/admin?page=${page}&size=${size}`,
providesTags: ["getIO"],
}),
getIOById: builder.query({
query: (id) => ({ url: `/io/admin/${id}` }),
providesTags: ["getIOById"],
}),
// =====[create]
createIO: builder.mutation({
query: (data) => ({
url: `/io/admin`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIO"],
}),
updateIO: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getIOById", "getIO", "prePopulate"],
}),
// =====[Key Merits]
getKeyMerits: builder.query({
query: (id) => `/io/admin/key-merits/${id}`,
providesTags: ["getKeyMerits"],
}),
createKeyMerits: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/key-merits/${id}`,
method: "POST",
body: data,
// No need to manually set 'Content-Type'
}),
invalidatesTags: ["getIOById"],
}),
deleteKeyMerits: builder.mutation({
query: (id) => ({
url: `/io/admin/key-merits/hard-delete/${id}`,
method: "DELETE",
}),
invalidatesTags: ["getIOById"],
}),
updateKeyMerits: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/key-merits/byId/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
// =====[getIODocument]
createInvestmentDocuments: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/document/${id}`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
updateInvestmentDocuments: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/document/byId/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
getInvestmentDocuments: builder.query({
query: (id) => `/io/admin/document/${id}`,
providesTags: ["getInvestmentDocuments"],
}),
deleteIODocs: builder.mutation({
query: (id) => ({
url: `/io/admin/document/hard-delete/${id}`,
method: "DELETE",
}),
invalidatesTags: ["getIOById"],
}),
// =====[Artifacts]
getArtifactsVideo: builder.query({
query: (id) => `/io/artifact/artifactVideo/${id}`,
providesTags: ["getArtifactsVideo"],
}),
// =====[createImageArtifacts]
createImageArtifacts: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/artifact/image/${id}`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
updateImageArtifacts: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/artifact/image/byId/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
// =====[createVideoArtifacts]
createVideoArtifacts: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/artifact/video/${id}`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
deleteVideoArtifacts: builder.mutation({
query: (id) => ({
url: `/io/admin/artifact/video/byId/${id}`,
method: "DELETE",
}),
invalidatesTags: ["getIOById"],
}),
deleteImageArtifacts: builder.mutation({
query: (id) => ({
url: `/io/admin/artifact/image/byId/${id}`,
method: "DELETE",
}),
invalidatesTags: ["getIOById"],
}),
updateVideoArtifacts: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/artifact/video/byId/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
updateStatusIo: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/transaction/${id}/update-status/`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIOById", "getIO"],
}),
createIoCash: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/transaction/${id}/io-cash/`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
createIoNav: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/transaction/${id}/io-nav/`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
// =====[ Amount Investment ] ======
amountIvestment: builder.mutation({
query: ({ data, id }) => ({
url: `/io/admin/transaction/${id}/amount-invested`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
// ======== [ Distribution Transaction ] ========
getDistributionInvestor: builder.mutation({
query: ({ id, data }) => ({
url: `/io/admin/transaction/${id}/calculate-distribution-amt`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
getDistributedToInvestor: builder.mutation({
query: ({ id, data }) => ({
url: `/io/admin/transaction/${id}/distributed-to-investor`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
updateExitToInvestor: builder.mutation({
query: ({ id, data }) => ({
url: `/io/admin/transaction/${id}/exit`,
method: "POST",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
// ==============[ Displaye Orders ]===============
setDisplayOrder: builder.mutation({
query: ({ data }) => ({
url: `/io/admin/key-merits/resetDisplayOrder`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
setDisplayOrderIODocuments: builder.mutation({
query: ({ data }) => ({
url: `/io/admin/document/resetDisplayOrder`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
setDisplayOrderIOArtifactsImage: builder.mutation({
query: ({ data }) => ({
url: `/io/admin/artifact/image/resetDisplayOrder`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
setDisplayOrderIOArtifactsVideo: builder.mutation({
query: ({ data }) => ({
url: `/io/admin/artifact/video/resetDisplayOrder`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getIOById"],
}),
// ========[Create Sponser]========
createSponser: builder.mutation({
query: (data) => ({
url: `/sponsor/admin`,
method: "POST",
body: data,
}),
invalidatesTags: ["getSponser","prePopulate"],
}),
// ========[Update Sponser]========
updateSponser: builder.mutation({
query: ({ data, id }) => ({
url: `/sponsor/admin/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getSponser","prePopulate"],
}),
// ======[Get All]=====
getSponserMaster: builder.query({
query: ({ page, size }) => `/sponsor/admin?page=${page}&size=${size}`,
providesTags: ["getSponser"],
}),
// ========[Delete Sponser]========
deleteSponser: builder.mutation({
query: (id) => ({
url: `/sponsor/admin/delete/${id}`,
method: "DELETE",
}),
invalidatesTags: ["getSponser"],
}),
// ========[Get Active]========
getActiveSponserMaster: builder.query({
query: () => `/sponsor/admin/active`,
}),
getSponserMasterActive: builder.query({
query: () => "/sponsor/admin/active",
}),
// ======[Get ID]=====
getSponserById: builder.query({
query: (id) => `/sponsor/admin/${id}`,
}),
// ========[Get Active]========
getActiveSponserMaster: builder.query({
query: () => `/sponsor/admin/active`,
}),
// ===============================[ Investment Type ]===================================
// ========[Get All]=========
getInvestmentTypes: builder.query({
query: ({ page, size }) =>
`/investmentType/admin?page=${page}&size=${size}`,
providesTags: ["getInvestmentType"],
}),
// ========[Get ID]=========
getInvestmentTypeById: builder.query({
query: (id) => `/investmentType/admin/${id}`,
providesTags: ["getInvestmentTypeID"],
}),
// ========[Create Investment]========
createInvestmentType: builder.mutation({
query: (data) => ({
url: `/investmentType/admin/`,
method: "POST",
body: data,
}),
invalidatesTags: ["getInvestmentType", "prePopulate"],
}),
// ========[Update Investment]=======
updateInvestmentType: builder.mutation({
query: ({ data, id }) => ({
url: `/investmentType/admin/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getInvestmentTypeID", "getInvestmentType", "prePopulate"],
}),
// ========[Delete Investment]=======
deleteInvestmentType: builder.mutation({
query: (id) => ({
url: `/investmentType/admin/delete/${id}`,
method: "DELETE",
}),
invalidatesTags: ["getInvestmentType", 'prePopulate'],
}),
}),
});
// Export hooks for usage in functional components
export const {
useGetIOprepopulateDataQuery,
useGetIOsQuery,
useGetIOByIdQuery,
useCreateIOMutation,
useUpdateIOMutation,
useGetKeyMeritsQuery,
useCreateKeyMeritsMutation,
useDeleteKeyMeritsMutation,
useUpdateKeyMeritsMutation,
useGetInvestmentDocumentsQuery,
useCreateInvestmentDocumentsMutation,
useDeleteIODocsMutation,
useUpdateInvestmentDocumentsMutation,
useCreateImageArtifactsMutation,
useUpdateImageArtifactsMutation,
useUpdateVideoArtifactsMutation,
useGetArtifactsVideoQuery,
useCreateVideoArtifactsMutation,
useDeleteVideoArtifactsMutation,
useDeleteImageArtifactsMutation,
useSetDisplayOrderMutation,
useSetDisplayOrderIODocumentsMutation,
useSetDisplayOrderIOArtifactsImageMutation,
useSetDisplayOrderIOArtifactsVideoMutation,
useCreateIoCashMutation,
useCreateIoNavMutation,
useUpdateStatusIoMutation,
useAmountIvestmentMutation,
useGetDistributionInvestorMutation,
useGetDistributedToInvestorMutation,
useUpdateExitToInvestorMutation,
// ==============[ Sponser ]===============
useGetSponserMasterQuery,
useGetSponserMasterActiveQuery,
useCreateSponserMutation,
useUpdateSponserMutation,
useGetSponserByIdQuery,
useDeleteSponserMutation,
useGetActiveSponserMasterQuery,
// ============[ Investment Type ]========
useGetInvestmentTypesQuery,
useGetInvestmentTypeByIdQuery,
useCreateInvestmentTypeMutation,
useUpdateInvestmentTypeMutation,
useDeleteInvestmentTypeMutation,
} = ioService;

View File

@@ -0,0 +1,48 @@
// investorDetails.service.js
import { createApi } from "@reduxjs/toolkit/query/react";
// import { api } from "./api.service";
import { baseQuery } from "./token.serivce";
// const baseUrl = api?.defaults.baseURL;
// Define a service using a base URL and expected endpoints
export const registerCorporate = createApi({
reducerPath: "registerCorporate",
baseQuery: baseQuery,
tagTypes: ["getAllCorp"],
endpoints: (builder) => ({
getAllCorp: builder.query({
// query: (searchData) => `/corporate/admin`,
query: (searchData) =>
`/corporate/admin/?search_data=${searchData}?page=${1}&size=${100}`,
providesTags: ["getAllCorp"],
}),
// =====[create]
corporateQuickAdd: builder.mutation({
query: (data) => ({
url: `/corporate/admin/quick-add`,
method: "POST",
body: data,
}),
invalidatesTags: ["getAllCorp"],
}),
getViewId: builder.query({
query: ({ data, id }) => ({
url: `/corporate/admin/${id}`,
method: "GET",
body: data,
}),
invalidatesTags: ["getAllCorp"],
}),
}),
});
// Export hooks for usage in functional components
export const {
useCorporateQuickAddMutation,
useGetAllCorpQuery,
useGetViewIdQuery,
} = registerCorporate;

View File

@@ -1,105 +0,0 @@
// //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 { baseQuery } from "./token.serivce";
// import { ioService } from "./io.service";
// // 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: baseQuery,
// tagTypes: ["getSponser", "prePopulate"],
// endpoints: (builder) => ({
// // ======[Get All]=====
// getSponserMaster: builder.query({
// query: ({ page, size }) => `/sponsor/admin?page=${page}&size=${size}`,
// providesTags: ["getSponser"],
// }),
// // ========[Get Active]========
// getActiveSponserMaster: builder.query({
// query: () => `/sponsor/admin/active`,
// }),
// getSponserMasterActive: builder.query({
// query: () => "/sponsor/admin/active",
// }),
// // ======[Get ID]=====
// getSponserById: builder.query({
// query: (id) => `/sponsor/admin/${id}`,
// }),
// // ========[Toggle Status]========
// toggleStatus: builder.mutation({
// query: ({ id }) => ({
// url: `/sponsor/admin/toggle-status/${id}`,
// method: "PATCH",
// }),
// invalidatesTags: ["getSponser"],
// }),
// // ========[Create Sponser]========
// createSponser: builder.mutation({
// query: (data) => ({
// url: `/sponsor/admin`,
// method: "POST",
// body: data,
// }),
// invalidatesTags: ["getSponser","prePopulate"],
// }),
// // ========[Update Sponser]========
// updateSponser: builder.mutation({
// query: ({ data, id }) => ({
// url: `/sponsor/admin/${id}`,
// method: "PATCH",
// body: data,
// }),
// invalidatesTags: ["getSponser"],
// }),
// // ========[Delete Sponser]========
// deleteSponser: builder.mutation({
// query: (id) => ({
// url: `/sponsor/admin/delete/${id}`,
// method: "DELETE",
// }),
// invalidatesTags: ["getSponser"],
// }),
// }),
// });
// // Export hooks for usage in functional components
// export const {
// useGetSponserMasterQuery,
// useGetSponserMasterActiveQuery,
// useToggleStatusMutation,
// useCreateSponserMutation,
// useUpdateSponserMutation,
// useGetSponserByIdQuery,
// useDeleteSponserMutation,
// useGetActiveSponserMasterQuery
// } = sponserMaster;

View File

@@ -1,21 +1,6 @@
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
// 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;
// },
// });
// Define a base query function with token refresh logic
console.log(import.meta.env.VITE_BASE_URL);
export const baseQuery = async (args, api, extraOptions) => { export const baseQuery = async (args, api, extraOptions) => {
let result = await fetchBaseQuery({ let result = await fetchBaseQuery({
baseUrl: import.meta.env.VITE_BASE_URL, baseUrl: import.meta.env.VITE_BASE_URL,
@@ -137,6 +122,14 @@ export const apiSlice = createApi({
}), }),
}), }),
setOtp: builder.mutation({
query: (data) => ({
url: "/auth/admin/verify-otp",
method: "POST",
body: data ,
}),
}),
@@ -157,4 +150,4 @@ export const apiSlice = createApi({
}), }),
}); });
export const { useLoginMutation, useRefreshTokenMutation, useForgotPasswordMutation, useResetPasswordMutation,useResendOtpMutation } = apiSlice; export const { useLoginMutation, useRefreshTokenMutation, useForgotPasswordMutation, useResetPasswordMutation,useResendOtpMutation, useSetOtpMutation } = apiSlice;

View File

@@ -1,37 +1,13 @@
import { configureStore } from "@reduxjs/toolkit"; import { configureStore } from "@reduxjs/toolkit";
import { setupListeners } from "@reduxjs/toolkit/query"; import { setupListeners } from "@reduxjs/toolkit/query";
// import { sponserMaster } from "../Services/sponser.service";
// import { investmentType } from "../Services/investment.type.service";
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 { 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"; import { apiSlice, baseQuery } from "../Services/token.serivce";
import { drawalRequest } from "../Services/drawal.request.service"; import { registerCorporate } from "../Services/register.corporate.service";
import { deleteRequest } from "../Services/delete.request.service";
import { banInvestorDetails } from "../Services/ban.investor.service";
export const store = configureStore({ export const store = configureStore({
reducer: { reducer: {
[apiSlice.reducerPath]: apiSlice.reducer, [apiSlice.reducerPath]: apiSlice.reducer,
// [sponserMaster.reducerPath]: sponserMaster.reducer, [registerCorporate.reducerPath]: registerCorporate.reducer,
// [investmentType.reducerPath]: investmentType.reducer,
[exchangeRate.reducerPath]: exchangeRate.reducer,
[ioService.reducerPath]: ioService.reducer,
[investorDetails.reducerPath]: investorDetails.reducer,
[investorTransaction.reducerPath]: investorTransaction.reducer,
[bankDetails.reducerPath]: bankDetails.reducer,
[contact.reducerPath]: contact.reducer,
[depositRequest.reducerPath]: depositRequest.reducer,
[drawalRequest.reducerPath]: drawalRequest.reducer,
[deleteRequest.reducerPath]: deleteRequest.reducer,
[banInvestorDetails.reducerPath]: banInvestorDetails.reducer,
// Add other reducers as needed
}, },
middleware: (getDefaultMiddleware) => middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({ getDefaultMiddleware({
@@ -40,18 +16,7 @@ export const store = configureStore({
}, },
}).concat( }).concat(
apiSlice.middleware, apiSlice.middleware,
// sponserMaster.middleware, registerCorporate.middleware,
// investmentType.middleware,
exchangeRate.middleware,
ioService.middleware,
investorDetails.middleware,
investorTransaction.middleware,
bankDetails.middleware,
contact.middleware,
depositRequest.middleware,
drawalRequest.middleware,
deleteRequest.middleware,
banInvestorDetails.middleware,
), ),
}); });

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 13 KiB

13
src/assets/Whitelogo.svg Normal file
View File

@@ -0,0 +1,13 @@
<svg width="192" height="75" viewBox="0 0 192 75" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M34.5072 75C49.9987 75 63.2962 65.6064 69.0145 52.2046C63.668 49.4748 60.0072 43.9149 60.0072 37.5C60.0072 31.0851 63.668 25.5252 69.0145 22.7954C63.2962 9.39356 49.9987 0 34.5072 0C19.0158 0 5.71827 9.39356 0 22.7954C5.34645 25.5252 9.00724 31.0851 9.00724 37.5C9.00724 43.9149 5.34645 49.4748 0 52.2046C5.71827 65.6064 19.0158 75 34.5072 75ZM9.00724 37.5C9.00724 23.4167 20.424 12 34.5072 12C48.5905 12 60.0072 23.4167 60.0072 37.5C60.0072 51.5833 48.5905 63 34.5072 63C20.424 63 9.00724 51.5833 9.00724 37.5Z" fill="white"/>
<path d="M81.0842 25.0287C77.8694 25.5075 75.3933 26.5335 73.2866 28.2435C71.0431 30.0629 69.5657 32.7031 69.1005 35.7538C69.0048 36.3557 68.9774 37.5185 69.0185 38.5581C69.1279 41.3899 69.7845 43.2504 71.4398 45.4392C73.7107 48.4488 77.4316 50.2682 82.1375 50.6786C87.3633 51.1163 92.2197 49.5295 95.1335 46.4378C97.3633 44.0848 98.2252 41.8961 98.3483 38.353C98.403 36.8071 98.3756 36.1094 98.1841 35.2066C97.336 31.0205 94.4085 27.6552 90.2224 26.0684C88.1567 25.2749 86.8298 25.056 84.0254 25.015C82.63 24.9876 81.3167 25.0013 81.0842 25.0287ZM87.2128 29.1737C90.7012 30.0903 93.1909 32.6211 93.7518 35.8085C93.9844 37.1628 93.8476 39.8441 93.4782 40.8564C92.6848 43.0862 91.2484 44.7141 89.1964 45.7128C87.459 46.5472 86.2962 46.7661 83.615 46.7524C81.563 46.7388 81.2483 46.7114 80.1266 46.3694C76.7476 45.3434 74.6136 43.2367 73.8338 40.1997C73.5876 39.2558 73.5602 36.8618 73.7791 35.6717C73.8475 35.2339 74.1895 34.3037 74.5178 33.6197C75.0103 32.6074 75.2976 32.2243 76.1457 31.4172C77.6095 30.0082 79.0459 29.3652 81.6998 28.8591C81.8913 28.8317 82.972 28.818 84.0938 28.8454C85.6259 28.8727 86.4194 28.9548 87.2128 29.1737Z" fill="white"/>
<path d="M146.857 25.7809C146.091 26.1639 145.722 26.7659 145.722 27.6687C145.722 28.4895 145.954 29.0094 146.542 29.5018C147.733 30.5142 149.935 30.2816 150.742 29.0641C151.166 28.4485 151.166 27.4362 150.756 26.7111C150.127 25.6031 148.17 25.1243 146.857 25.7809Z" fill="white"/>
<path d="M179.032 26.3693C178.458 26.6155 177.897 27.3132 177.787 27.8878C177.637 28.7222 177.842 29.3378 178.485 29.9671C179.812 31.2257 182.096 31.0342 182.821 29.5841C183.341 28.5991 182.958 27.2858 181.96 26.6292C181.481 26.3146 181.207 26.2462 180.414 26.2051C179.798 26.1915 179.292 26.2462 179.032 26.3693Z" fill="white"/>
<path d="M187.691 26.4512C187.034 26.6428 186.515 27.1216 186.282 27.7508C185.625 29.4608 187.226 31.1435 189.319 30.9246C191.412 30.7057 192.137 28.4348 190.55 27.0395C189.811 26.3828 188.676 26.1503 187.691 26.4512Z" fill="white"/>
<path d="M155.435 28.4622C155.435 29.3514 155.503 32.2926 155.571 35.0013C155.64 37.7099 155.736 42.1695 155.777 44.9192C155.818 47.6689 155.886 50.1723 155.927 50.487L155.995 51.0752H158.061H160.127L160.031 46.1231L159.922 41.1846L167.459 41.2804L174.997 41.3898L174.915 39.5567C174.86 38.4896 174.751 37.6962 174.669 37.6415C174.586 37.5868 173.191 37.532 171.577 37.532C169.963 37.532 166.652 37.491 164.244 37.4363L159.853 37.3542L159.744 34.071C159.689 32.2789 159.703 30.7468 159.771 30.6921C159.826 30.6374 163.273 30.6647 167.405 30.7468C171.55 30.8426 174.97 30.8699 175.024 30.8289C175.079 30.7878 175.093 29.967 175.038 29.0231L174.956 27.2994L172.89 27.2174C170.578 27.1353 158.143 26.8617 156.502 26.8617H155.435V28.4622Z" fill="white"/>
<path d="M131.234 29.283C130.92 30.2543 130.523 31.376 130.373 31.8001L130.113 32.5525L128.129 33.0176L126.159 33.4691V34.3856V35.3022L128.088 35.3843C129.155 35.4253 130.044 35.4937 130.072 35.5211C130.099 35.5484 130.154 37.7509 130.208 40.4185C130.277 44.5088 130.332 45.4253 130.55 46.3282C131.002 48.2571 132.001 49.543 133.669 50.3912C134.86 50.9794 136.063 51.2256 137.91 51.2256C139.579 51.2393 140.537 51.1025 142.042 50.6784C143.615 50.227 143.533 50.3501 143.533 48.4897C143.533 47.6005 143.492 46.8481 143.451 46.7933C143.396 46.7523 143.232 46.7933 143.068 46.9028C142.288 47.4089 141.139 47.6825 139.415 47.7509C137.24 47.8467 136.419 47.6415 135.544 46.7933C134.572 45.8631 134.504 45.4801 134.408 40.0902L134.326 35.4663L138.649 35.5621L142.986 35.6579V34.1394C142.986 33.3049 142.931 32.5936 142.862 32.5525C142.794 32.4978 140.851 32.4294 138.553 32.3747L134.367 32.2926L134.34 30.3637C134.326 29.2967 134.312 28.2433 134.299 28.0244L134.285 27.614L133.068 27.573L131.836 27.5456L131.234 29.283Z" fill="white"/>
<path d="M114.052 31.595C113.901 31.6223 113.436 31.7181 113.026 31.8002C110.919 32.2242 108.498 33.9342 107.171 35.9178C106.993 36.2051 106.788 36.4377 106.747 36.4377C106.692 36.4377 106.665 35.4117 106.665 34.1394V31.8549L104.517 31.8139L102.356 31.7728V35.1654C102.356 37.0396 102.315 42.4842 102.26 47.2722L102.178 56H104.38H106.596V50.87C106.596 48.0519 106.637 45.74 106.706 45.74C106.761 45.7537 106.979 46.041 107.198 46.383C108.224 47.9972 110.358 49.7619 112.027 50.3912C114.613 51.3625 117.746 51.2531 120.057 50.0903C122.109 49.0643 123.696 47.2038 124.476 44.8508C124.818 43.8385 124.845 43.5786 124.859 41.4993C124.859 39.6661 124.804 39.0779 124.599 38.3529C123.86 35.8084 122.15 33.688 120.003 32.6346C119.36 32.32 118.471 31.9643 118.019 31.8412C117.212 31.636 114.599 31.4582 114.052 31.595ZM115.488 34.9466C118.443 35.4117 120.345 37.5868 120.618 40.8426C120.782 42.7168 120.208 44.4952 119.018 45.8084C117.144 47.8604 113.942 48.2571 111.124 46.766C109.414 45.8632 108.142 44.4815 107.048 42.3611L106.46 41.212L107.171 39.8303C108.539 37.149 110.769 35.357 113.204 34.9466C114.202 34.7824 114.476 34.7824 115.488 34.9466Z" fill="white"/>
<path d="M146.446 36.5198C146.501 38.777 146.583 42.9357 146.624 45.7675L146.72 50.9385H148.84H150.947L150.865 48.777C150.824 47.6006 150.756 44.1669 150.714 41.1573C150.673 38.1477 150.605 34.9603 150.564 34.0848L150.482 32.4705L149.907 32.58C149.155 32.7031 147.855 32.7031 147.035 32.5526L146.364 32.4295L146.446 36.5198Z" fill="white"/>
<path d="M178.595 34.8919C178.636 35.9316 178.786 40.0219 178.909 43.9754L179.156 51.1847L179.84 51.2668C180.223 51.3078 181.139 51.3489 181.878 51.3489H183.205V50.3229C183.205 49.379 182.699 34.8782 182.617 33.6333C182.589 33.0314 182.658 33.0451 181.262 33.2777C180.825 33.3597 180.291 33.3597 180.031 33.2913C179.785 33.2366 179.333 33.1409 179.046 33.0861L178.513 32.9904L178.595 34.8919Z" fill="white"/>
<path d="M186.939 34.2079C186.994 34.7961 187.158 38.8454 187.322 43.2093C187.486 47.5732 187.65 51.1847 187.705 51.2394C187.746 51.2804 188.676 51.3488 189.757 51.3762L191.713 51.4172L191.631 49.16C191.536 46.6156 191.358 42.5116 191.125 37.0533C191.043 35.015 190.947 33.3323 190.92 33.305C190.893 33.2639 190.414 33.305 189.867 33.4007C189.087 33.5102 188.704 33.5102 187.992 33.3597C187.5 33.2503 187.049 33.1682 186.98 33.1545C186.912 33.1545 186.898 33.6196 186.939 34.2079Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

4
src/assets/gift.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg width="30" height="19" viewBox="0 0 30 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18.0509 7.46079H14.5308L15.7219 7.21264C16.0267 7.14884 16.2891 6.95741 16.445 6.69154C16.601 6.42212 16.6365 6.09953 16.5408 5.8053C16.4309 5.46144 16.1579 5.19202 15.8105 5.08922C15.4631 4.98642 15.0873 5.05732 14.8073 5.28774L12.9107 6.81561L11.0142 5.28774C10.7306 5.06086 10.3584 4.98642 10.011 5.08922C9.66356 5.19202 9.3906 5.46144 9.2807 5.8053C9.18499 6.09953 9.22044 6.42567 9.37642 6.69154C9.5324 6.96095 9.79472 7.14884 10.0996 7.21264L11.2907 7.46079H7.77055C7.55786 7.46079 7.38416 7.63449 7.38416 7.84719V10.0947C7.38416 10.3074 7.55786 10.4811 7.77055 10.4811H8.08251V16.5146C8.08251 16.7273 8.25621 16.901 8.46891 16.901H17.349C17.5617 16.901 17.7354 16.7273 17.7354 16.5146V10.4811H18.0474C18.2601 10.4811 18.4338 10.3074 18.4338 10.0947V7.84719C18.4338 7.63449 18.2601 7.46079 18.0474 7.46079H18.0509ZM15.2965 5.88329C15.3567 5.8372 15.4241 5.81239 15.4985 5.81239C15.5305 5.81239 15.5624 5.81593 15.5943 5.82657C15.6971 5.85847 15.7751 5.93292 15.8105 6.03572C15.8389 6.12435 15.8282 6.21651 15.7821 6.29805C15.7361 6.37958 15.6616 6.43276 15.5694 6.45048L14.2543 6.72699L15.3 5.88329H15.2965ZM10.05 6.29805C10.0039 6.21651 9.99324 6.12435 10.0216 6.03572C10.0535 5.93292 10.1315 5.85493 10.2378 5.82657C10.2697 5.81593 10.3016 5.81239 10.3336 5.81239C10.4045 5.81239 10.4754 5.8372 10.5356 5.88329L11.5814 6.72699L10.2662 6.45048C10.174 6.43276 10.0996 6.37604 10.0535 6.29805H10.05ZM11.6629 16.1282H8.85886V10.4811H11.6629V16.1282ZM11.6629 9.70829H8.16404V8.23714H11.6629V9.70829ZM13.3893 16.1282H12.4393V8.23714H13.3893V16.1282ZM16.9662 16.1282H14.1621V10.4811H16.9662V16.1282ZM17.6645 9.70829H14.1656V8.23714H17.6645V9.70829Z" fill="#3725EA"/>
<path d="M29.1182 13.8386L27.8598 1.75736C27.7463 0.683243 26.7821 -0.0966453 25.708 0.00970325L3.57685 2.31392C3.08765 2.36355 2.65871 2.59752 2.3503 2.93429H1.96036C0.879148 2.93429 0 3.81343 0 4.89464V17.0396C0 18.1209 0.879148 19 1.96036 19H24.212C25.2932 19 26.1724 18.1209 26.1724 17.0396V16.1144L27.3741 15.9903C28.4482 15.8769 29.2317 14.9127 29.1218 13.8386H29.1182ZM25.1053 17.0432C25.1053 17.5359 24.7048 17.9401 24.2085 17.9401H1.95681C1.46406 17.9401 1.05994 17.5395 1.05994 17.0432V4.89819C1.05994 4.40544 1.46052 4.00132 1.95681 4.00132H24.2085C24.7012 4.00132 25.1053 4.4019 25.1053 4.89819V17.0432ZM27.2607 14.9339L26.1688 15.0474V4.89464C26.1688 3.81343 25.2897 2.93429 24.2085 2.93429H7.89815L25.8214 1.0661C25.8533 1.0661 25.8852 1.06255 25.9171 1.06255C26.1227 1.06255 26.3177 1.13345 26.4808 1.26107C26.6651 1.4135 26.7821 1.6262 26.8069 1.86371L28.0654 13.9449C28.115 14.4376 27.757 14.8772 27.2678 14.9304L27.2607 14.9339Z" fill="#3725EA"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

13
src/assets/logo_card.svg Normal file
View File

@@ -0,0 +1,13 @@
<svg width="81" height="33" viewBox="0 0 81 33" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M32.9669 10.7619C31.5777 10.9704 30.5078 11.4171 29.5974 12.1617C28.628 12.954 27.9895 14.1036 27.7886 15.432C27.7472 15.694 27.7354 16.2004 27.7531 16.6531C27.8004 17.8861 28.0841 18.6962 28.7994 19.6493C29.7807 20.9598 31.3885 21.752 33.422 21.9307C35.6802 22.1213 37.7787 21.4303 39.0378 20.0841C40.0013 19.0596 40.3737 18.1065 40.4269 16.5637C40.4506 15.8906 40.4387 15.5868 40.356 15.1937C39.9895 13.3709 38.7245 11.9056 36.9156 11.2146C36.023 10.8691 35.4496 10.7738 34.2378 10.7559C33.6348 10.744 33.0674 10.75 32.9669 10.7619ZM35.6151 12.5668C37.1225 12.9659 38.1984 14.0679 38.4407 15.4558C38.5412 16.0455 38.4821 17.213 38.3225 17.6538C37.9796 18.6247 37.359 19.3336 36.4723 19.7684C35.7215 20.1318 35.2191 20.2271 34.0605 20.2211C33.1738 20.2152 33.0378 20.2033 32.5531 20.0544C31.093 19.6076 30.1708 18.6903 29.8339 17.3679C29.7275 16.9569 29.7156 15.9144 29.8102 15.3962C29.8398 15.2056 29.9876 14.8005 30.1294 14.5027C30.3422 14.0619 30.4664 13.8951 30.8329 13.5437C31.4654 12.9301 32.0861 12.6502 33.2329 12.4298C33.3156 12.4179 33.7826 12.4119 34.2674 12.4238C34.9294 12.4357 35.2723 12.4715 35.6151 12.5668Z" fill="white"/>
<path d="M61.3891 11.0891C61.058 11.2559 60.8984 11.518 60.8984 11.9112C60.8984 12.2686 60.9989 12.4949 61.2531 12.7094C61.7674 13.1501 62.7191 13.0489 63.0679 12.5187C63.2511 12.2507 63.2511 11.8099 63.0738 11.4942C62.8019 11.0117 61.9566 10.8032 61.3891 11.0891Z" fill="white"/>
<path d="M75.2916 11.3449C75.0434 11.4521 74.801 11.7559 74.7537 12.0061C74.6887 12.3695 74.7774 12.6375 75.0552 12.9115C75.6286 13.4596 76.6158 13.3762 76.9291 12.7447C77.1537 12.3159 76.9882 11.744 76.5567 11.4581C76.3498 11.3211 76.2315 11.2913 75.8887 11.2734C75.6227 11.2675 75.404 11.2913 75.2916 11.3449Z" fill="white"/>
<path d="M79.0327 11.3807C78.749 11.4641 78.5243 11.6726 78.4239 11.9466C78.1401 12.6912 78.8317 13.4238 79.7362 13.3285C80.6406 13.2332 80.9539 12.2444 80.2682 11.6368C79.949 11.3509 79.4583 11.2496 79.0327 11.3807Z" fill="white"/>
<path d="M65.0947 12.2561C65.0947 12.6433 65.1243 13.924 65.1538 15.1034C65.1834 16.2828 65.2248 18.2247 65.2425 19.422C65.2602 20.6193 65.2898 21.7094 65.3075 21.8464L65.3371 22.1025H66.2297H67.1223L67.0809 19.9462L67.0336 17.7958L70.2908 17.8375L73.5479 17.8852L73.5124 17.087C73.4888 16.6224 73.4415 16.2769 73.406 16.2531C73.3705 16.2292 72.7676 16.2054 72.0701 16.2054C71.3725 16.2054 69.942 16.1875 68.9016 16.1637L67.0041 16.128L66.9568 14.6984C66.9331 13.918 66.9391 13.2509 66.9686 13.2271C66.9923 13.2032 68.4819 13.2151 70.2671 13.2509C72.0582 13.2926 73.5361 13.3045 73.5597 13.2866C73.5834 13.2688 73.5893 12.9114 73.5656 12.5003L73.5302 11.7498L72.6375 11.7141C71.6385 11.6783 66.2652 11.5592 65.5558 11.5592H65.0947V12.2561Z" fill="white"/>
<path d="M54.6374 12.613C54.5015 13.036 54.33 13.5244 54.265 13.7091L54.1527 14.0367L53.2956 14.2392L52.4443 14.4358V14.8349V15.234L53.2778 15.2697C53.7389 15.2876 54.1231 15.3174 54.135 15.3293C54.1468 15.3412 54.1704 16.3002 54.1941 17.4618C54.2236 19.2428 54.2473 19.6419 54.3419 20.0351C54.5369 20.875 54.9685 21.4349 55.6896 21.8042C56.2039 22.0603 56.7241 22.1676 57.5221 22.1676C58.2433 22.1735 58.6571 22.114 59.3074 21.9293C59.9872 21.7327 59.9517 21.7863 59.9517 20.9762C59.9517 20.589 59.934 20.2614 59.9162 20.2376C59.8926 20.2197 59.8216 20.2376 59.7507 20.2853C59.4138 20.5056 58.9172 20.6248 58.1724 20.6546C57.2325 20.6963 56.8778 20.6069 56.4995 20.2376C56.0798 19.8325 56.0502 19.6658 56.0088 17.3188L55.9734 15.3055L57.8414 15.3471L59.7152 15.3888V14.7277C59.7152 14.3643 59.6916 14.0545 59.662 14.0367C59.6325 14.0128 58.7931 13.9831 57.8 13.9592L55.9911 13.9235L55.9793 13.0836C55.9734 12.619 55.9675 12.1603 55.9616 12.065L55.9556 11.8863L55.4295 11.8684L54.8975 11.8565L54.6374 12.613Z" fill="white"/>
<path d="M47.213 13.6203C47.148 13.6322 46.947 13.6739 46.7697 13.7097C45.8594 13.8943 44.8131 14.6389 44.2397 15.5026C44.1628 15.6277 44.0741 15.729 44.0564 15.729C44.0328 15.729 44.0209 15.2822 44.0209 14.7283V13.7335L43.0929 13.7156L42.1589 13.6978V15.175C42.1589 15.9911 42.1411 18.3619 42.1175 20.4467L42.082 24.2471H43.0338H43.9914V22.0133C43.9914 20.7862 44.0091 19.7795 44.0387 19.7795C44.0623 19.7855 44.1569 19.9106 44.2515 20.0595C44.6948 20.7624 45.617 21.5308 46.3382 21.8048C47.4554 22.2277 48.8091 22.1801 49.8081 21.6738C50.6948 21.227 51.3805 20.4169 51.7175 19.3924C51.8652 18.9516 51.8771 18.8384 51.883 17.933C51.883 17.1348 51.8593 16.8786 51.7707 16.5629C51.4514 15.455 50.7125 14.5317 49.7845 14.073C49.5066 13.936 49.1224 13.7812 48.9273 13.7275C48.5786 13.6382 47.4495 13.5608 47.213 13.6203ZM47.8337 15.0797C49.1106 15.2822 49.9322 16.2294 50.0505 17.647C50.1214 18.4631 49.8731 19.2375 49.3588 19.8093C48.549 20.7028 47.1658 20.8756 45.948 20.2263C45.2091 19.8332 44.6594 19.2315 44.1865 18.3082L43.9323 17.8079L44.2397 17.2063C44.8308 16.0387 45.7943 15.2584 46.8465 15.0797C47.2781 15.0082 47.3963 15.0082 47.8337 15.0797Z" fill="white"/>
<path d="M61.2103 15.7636C61.2339 16.7465 61.2694 18.5573 61.2871 19.7904L61.3285 22.042H62.2448H63.1551L63.1196 21.1008C63.1019 20.5886 63.0723 19.0934 63.0546 17.783C63.0369 16.4725 63.0073 15.0846 62.9896 14.7033L62.9541 14.0004L62.7058 14.0481C62.3807 14.1017 61.8191 14.1017 61.4645 14.0362L61.1748 13.9826L61.2103 15.7636Z" fill="white"/>
<path d="M75.1029 15.0558C75.1206 15.5085 75.1856 17.2895 75.2388 19.011L75.3452 22.1502L75.6408 22.1859C75.8063 22.2038 76.2024 22.2217 76.5216 22.2217H77.095V21.7749C77.095 21.3639 76.8762 15.0498 76.8408 14.5078C76.829 14.2457 76.8585 14.2516 76.2556 14.3529C76.0664 14.3886 75.8359 14.3886 75.7235 14.3588C75.6171 14.335 75.4221 14.2933 75.2979 14.2695L75.0674 14.2278L75.1029 15.0558Z" fill="white"/>
<path d="M78.7092 14.7584C78.7328 15.0146 78.8038 16.7777 78.8747 18.6779C78.9456 20.5781 79.0166 22.1507 79.0402 22.1745C79.058 22.1924 79.4599 22.2222 79.9269 22.2341L80.7722 22.252L80.7368 21.2691C80.6954 20.1612 80.6185 18.3741 80.5181 15.9974C80.4826 15.1099 80.4412 14.3772 80.4294 14.3653C80.4176 14.3474 80.2107 14.3653 79.9742 14.407C79.6373 14.4546 79.4718 14.4546 79.1644 14.3891C78.9516 14.3415 78.7565 14.3057 78.7269 14.2998C78.6974 14.2998 78.6915 14.5023 78.7092 14.7584Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.4688 0.298735C8.91207 0.298735 3.28392 4.30495 0.863514 10.0207C3.07895 11.1596 4.61106 13.4552 4.67588 16.1175C4.76876 10.1917 9.5648 5.41677 15.4676 5.41677C21.4284 5.41677 26.2607 10.2861 26.2607 16.2927C26.2607 22.2994 21.4284 27.1687 15.4676 27.1687C9.56508 27.1687 4.76921 22.3942 4.67589 16.4688C4.61127 19.1312 3.0793 21.4269 0.863949 22.5659C3.2846 28.2811 8.91246 32.2869 15.4688 32.2869C22.0255 32.2869 27.6537 28.2806 30.0741 22.5648C27.8124 21.4001 26.2641 19.0295 26.2641 16.2944C26.2641 13.5589 27.813 11.1879 30.0752 10.0234C27.6554 4.30622 22.0265 0.298735 15.4688 0.298735Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

9
src/assets/pancard.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
src/assets/rupayImg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB