[ update reversal service ]
This commit is contained in:
@@ -24,7 +24,7 @@ import {
|
||||
Button,
|
||||
Image,
|
||||
Text,
|
||||
Tooltip
|
||||
Tooltip,
|
||||
} from "@chakra-ui/react";
|
||||
import Cookies from "js-cookie"; // Import the Cookies library
|
||||
import { GrManual } from "react-icons/gr";
|
||||
@@ -32,6 +32,7 @@ import { HiOutlineChartSquareBar } from "react-icons/hi";
|
||||
import { LuContact } from "react-icons/lu";
|
||||
import { MdNotificationsNone, MdOutlineAddChart } from "react-icons/md";
|
||||
import {
|
||||
RiAccountBoxLine,
|
||||
RiBankLine,
|
||||
RiExchangeBoxLine,
|
||||
RiFileUserLine,
|
||||
@@ -41,7 +42,7 @@ import {
|
||||
TbLayoutDashboard,
|
||||
TbListDetails,
|
||||
TbReportMoney,
|
||||
TbTransactionDollar
|
||||
TbTransactionDollar,
|
||||
} from "react-icons/tb";
|
||||
import { VscSymbolClass } from "react-icons/vsc";
|
||||
import {
|
||||
@@ -64,6 +65,7 @@ import { nav } from "../Routes/Nav";
|
||||
import { RouteLink } from "../Routes/Routes";
|
||||
import { useProfileQuery } from "../Services/io.service";
|
||||
import { useLogoutMutation } from "../Services/token.serivce";
|
||||
import { HiOutlineBanknotes } from "react-icons/hi2";
|
||||
|
||||
const DashboardLayout = ({ isOnline }) => {
|
||||
const navigate = useNavigate();
|
||||
@@ -141,19 +143,20 @@ const DashboardLayout = ({ isOnline }) => {
|
||||
case "/":
|
||||
return "👋🏻 Hi, Admin";
|
||||
|
||||
case path.startsWith("/"):
|
||||
return (
|
||||
<span className="d-flex align-items-end gap-2">
|
||||
<TbLayoutDashboard className="h4 m-0" />Dashboard
|
||||
</span>
|
||||
);
|
||||
// case path.startsWith("/"):
|
||||
// return (z
|
||||
// <span className="d-flex align-items-end gap-2">
|
||||
// <TbLayoutDashboard className="h4 m-0" />Dashboard
|
||||
// </span>
|
||||
// );
|
||||
|
||||
case path.startsWith("/investment-opportunities"):
|
||||
return (
|
||||
<span className="d-flex align-items-end gap-2">
|
||||
<TbLayoutDashboard className="h4 m-0" />dashboard / Open Opportunities
|
||||
</span>
|
||||
);
|
||||
return (
|
||||
<span className="d-flex align-items-end gap-2">
|
||||
<TbLayoutDashboard className="h4 m-0" />
|
||||
dashboard / Open Opportunities
|
||||
</span>
|
||||
);
|
||||
case path.startsWith("/sponser"):
|
||||
return (
|
||||
<span className="d-flex align-items-end gap-2">
|
||||
@@ -294,6 +297,29 @@ const DashboardLayout = ({ isOnline }) => {
|
||||
Deletion request
|
||||
</span>
|
||||
);
|
||||
|
||||
case path.startsWith("/bank-deposit-request"):
|
||||
return (
|
||||
<span className="d-flex align-items-end gap-2">
|
||||
<RiBankLine className="h4 m-0 fw-normal" />
|
||||
Bank Deposit Request
|
||||
</span>
|
||||
);
|
||||
case path.startsWith("/reversal-fawateer-deposit"):
|
||||
return (
|
||||
<span className="d-flex align-items-end gap-2">
|
||||
<HiOutlineBanknotes className="h4 m-0 fw-normal" />
|
||||
Fawateer Deposit
|
||||
</span>
|
||||
);
|
||||
case path.startsWith("/account-deletion-request"):
|
||||
return (
|
||||
<span className="d-flex align-items-end gap-2">
|
||||
<RiAccountBoxLine className="h4 m-0 fw-normal" />
|
||||
Account Deletion Request
|
||||
</span>
|
||||
);
|
||||
|
||||
case path.startsWith("/bank-investor"):
|
||||
return (
|
||||
<span className="d-flex align-items-end gap-2">
|
||||
@@ -312,7 +338,7 @@ const DashboardLayout = ({ isOnline }) => {
|
||||
return (
|
||||
<span className="d-flex align-items-end gap-2">
|
||||
<MdNotificationsNone className="h4 m-0 fw-normal" />
|
||||
Push Notification
|
||||
Push Notification
|
||||
</span>
|
||||
);
|
||||
case path.startsWith("/contact"):
|
||||
@@ -364,7 +390,7 @@ const DashboardLayout = ({ isOnline }) => {
|
||||
Deletion request
|
||||
</span>
|
||||
);
|
||||
case path.startsWith("/subadmin"):
|
||||
case path.startsWith("/subadmin"):
|
||||
return (
|
||||
<span className="d-flex align-items-end gap-2">
|
||||
<RiMoneyDollarBoxLine className="h4 m-0 fw-normal" />
|
||||
@@ -530,12 +556,170 @@ const DashboardLayout = ({ isOnline }) => {
|
||||
index={openIndex}
|
||||
onChange={handleAccordionChange}
|
||||
>
|
||||
{filteredNav.map(({ title, type, Icon, submenu, path }, index) => {
|
||||
if (type === "accordion") {
|
||||
return (
|
||||
<AccordionItem key={index} border={"none"}>
|
||||
{filteredNav.map(
|
||||
({ title, type, Icon, submenu, path }, index) => {
|
||||
if (type === "accordion") {
|
||||
return (
|
||||
<AccordionItem key={index} border={"none"}>
|
||||
<Tooltip
|
||||
isDisabled={isDrawerOpen || openDrawerClick}
|
||||
hasArrow
|
||||
bg={"#fff"}
|
||||
fontSize={"xs"}
|
||||
label={title}
|
||||
placement="top-start"
|
||||
color={"blue.800"}
|
||||
>
|
||||
<AccordionButton
|
||||
style={{ height: "auto" }}
|
||||
className={`${
|
||||
isDrawerOpen || openDrawerClick
|
||||
? "p-2 web-text-medium ps-3 justify-content-between"
|
||||
: "p-2 ps-1 web-text-xlarge justify-content-center"
|
||||
} rounded-1 link d-flex align-items-center gap-2 w-100 mb-1`}
|
||||
>
|
||||
<Box
|
||||
as="span"
|
||||
display={"flex"}
|
||||
gap={2}
|
||||
alignItems={"center"}
|
||||
>
|
||||
{/* {Icon && title === "Admin" ? <Image w={15} src={shield} /> : <Icon className={`web-text-large`} />} */}
|
||||
{Icon && (
|
||||
<Icon
|
||||
fontSize={title === "Admin" ? "18px" : "15px"}
|
||||
/>
|
||||
)}
|
||||
|
||||
<Text
|
||||
as={"span"}
|
||||
display={
|
||||
isDrawerOpen || openDrawerClick
|
||||
? "flex"
|
||||
: "none"
|
||||
}
|
||||
alignItems="center"
|
||||
overflow="hidden"
|
||||
textAlign={"left"}
|
||||
>
|
||||
{title}
|
||||
</Text>
|
||||
</Box>
|
||||
<AccordionIcon />
|
||||
</AccordionButton>
|
||||
</Tooltip>
|
||||
<AccordionPanel
|
||||
p={0}
|
||||
pb={1}
|
||||
display={"flex"}
|
||||
flexDirection={"column"}
|
||||
gap={1}
|
||||
>
|
||||
{submenu?.map(
|
||||
(
|
||||
{
|
||||
title: subMenuTitle,
|
||||
path: link,
|
||||
icon: SubIcon,
|
||||
},
|
||||
i
|
||||
) => (
|
||||
<Tooltip
|
||||
isDisabled={isDrawerOpen || openDrawerClick}
|
||||
hasArrow
|
||||
bg={"#fff"}
|
||||
fontSize={"xs"}
|
||||
label={subMenuTitle}
|
||||
placement="right"
|
||||
color={"blue.800"}
|
||||
>
|
||||
<Box
|
||||
key={i}
|
||||
style={{
|
||||
height: "auto",
|
||||
position: "relative",
|
||||
}}
|
||||
className={`${
|
||||
isDrawerOpen || openDrawerClick
|
||||
? " web-text-medium ps-4"
|
||||
: " web-text-xlarge justify-content-center"
|
||||
} d-flex align-items-center p-0`}
|
||||
>
|
||||
<Box
|
||||
backgroundColor={"gray.300"}
|
||||
style={{
|
||||
position: "absolute",
|
||||
top: 0,
|
||||
width: 2,
|
||||
left: 22,
|
||||
height:
|
||||
i === submenu?.length - 1
|
||||
? "55%"
|
||||
: "120%",
|
||||
borderRadius: "0 0 10px 10px",
|
||||
}}
|
||||
/>
|
||||
<Box
|
||||
backgroundColor={"gray.300"}
|
||||
style={{
|
||||
position: "absolute",
|
||||
width: 10,
|
||||
left: 22,
|
||||
height: 2,
|
||||
}}
|
||||
/>
|
||||
|
||||
<NavLink
|
||||
className={`${
|
||||
isDrawerOpen || openDrawerClick
|
||||
? "p-2 ps-1 ms-2 web-text-medium "
|
||||
: "p-2 ps-0 ms-0 zindex-3 ms-4 web-text-xlarge justify-content-center"
|
||||
} rounded-1 link d-flex align-items-center gap-2 w-100 `}
|
||||
to={link}
|
||||
>
|
||||
{SubIcon && (
|
||||
<SubIcon
|
||||
className="web-text-large ms-2"
|
||||
style={{ zIndex: 111 }}
|
||||
/>
|
||||
)}
|
||||
<Text
|
||||
as={"span"}
|
||||
display={
|
||||
isDrawerOpen || openDrawerClick
|
||||
? "flex"
|
||||
: "none"
|
||||
}
|
||||
alignItems="center"
|
||||
overflow="hidden"
|
||||
>
|
||||
{subMenuTitle === "Aprover Request"
|
||||
? data?.data?.role === "Maker"
|
||||
? "Create Request"
|
||||
: "Aprover Request"
|
||||
: subMenuTitle}
|
||||
</Text>
|
||||
</NavLink>
|
||||
</Box>
|
||||
</Tooltip>
|
||||
)
|
||||
)}
|
||||
</AccordionPanel>
|
||||
</AccordionItem>
|
||||
);
|
||||
} else if (type === "title") {
|
||||
return (
|
||||
<Text
|
||||
as={"span"}
|
||||
key={index}
|
||||
className="web-text-xxsmall fw-600 text-secondary fw-bold"
|
||||
>
|
||||
{title}
|
||||
</Text>
|
||||
);
|
||||
} else if (type === "single") {
|
||||
return (
|
||||
<Tooltip
|
||||
isDisabled={isDrawerOpen || openDrawerClick}
|
||||
hasArrow
|
||||
bg={"#fff"}
|
||||
fontSize={"xs"}
|
||||
@@ -543,184 +727,35 @@ const DashboardLayout = ({ isOnline }) => {
|
||||
placement="top-start"
|
||||
color={"blue.800"}
|
||||
>
|
||||
<AccordionButton
|
||||
style={{ height: "auto" }}
|
||||
<NavLink
|
||||
key={index}
|
||||
style={{ height: "auto", position: "relative" }}
|
||||
className={`${
|
||||
isDrawerOpen || openDrawerClick
|
||||
? "p-2 web-text-medium ps-3 justify-content-between"
|
||||
: "p-2 ps-1 web-text-xlarge justify-content-center"
|
||||
} rounded-1 link d-flex align-items-center gap-2 w-100 mb-1`}
|
||||
? "p-2 web-text-medium"
|
||||
: "p-2 ps-0 web-text-xlarge justify-content-start"
|
||||
} rounded-1 link d-flex align-items-center gap-2 w-100 mb-2`}
|
||||
to={path}
|
||||
>
|
||||
<Box
|
||||
as="span"
|
||||
display={"flex"}
|
||||
gap={2}
|
||||
alignItems={"center"}
|
||||
{Icon && <Icon className="web-text-large ms-2" />}
|
||||
<Text
|
||||
as={"span"}
|
||||
display={
|
||||
isDrawerOpen || openDrawerClick ? "flex" : "none"
|
||||
}
|
||||
alignItems="center"
|
||||
overflow="hidden"
|
||||
>
|
||||
{/* {Icon && title === "Admin" ? <Image w={15} src={shield} /> : <Icon className={`web-text-large`} />} */}
|
||||
{Icon && (
|
||||
<Icon
|
||||
fontSize={title === "Admin" ? "18px" : "15px"}
|
||||
/>
|
||||
)}
|
||||
|
||||
<Text
|
||||
as={"span"}
|
||||
display={
|
||||
isDrawerOpen || openDrawerClick
|
||||
? "flex"
|
||||
: "none"
|
||||
}
|
||||
alignItems="center"
|
||||
overflow="hidden"
|
||||
textAlign={"left"}
|
||||
>
|
||||
{title}
|
||||
</Text>
|
||||
</Box>
|
||||
<AccordionIcon />
|
||||
</AccordionButton>
|
||||
{title}
|
||||
</Text>
|
||||
</NavLink>
|
||||
</Tooltip>
|
||||
<AccordionPanel
|
||||
p={0}
|
||||
pb={1}
|
||||
display={"flex"}
|
||||
flexDirection={"column"}
|
||||
gap={1}
|
||||
>
|
||||
{submenu?.map(
|
||||
(
|
||||
{ title: subMenuTitle, path: link, icon: SubIcon },
|
||||
i
|
||||
) => (
|
||||
<Tooltip
|
||||
isDisabled={isDrawerOpen || openDrawerClick}
|
||||
hasArrow
|
||||
bg={"#fff"}
|
||||
fontSize={"xs"}
|
||||
label={subMenuTitle}
|
||||
placement="right"
|
||||
color={"blue.800"}
|
||||
>
|
||||
<Box
|
||||
key={i}
|
||||
style={{ height: "auto", position: "relative" }}
|
||||
className={`${
|
||||
isDrawerOpen || openDrawerClick
|
||||
? " web-text-medium ps-4"
|
||||
: " web-text-xlarge justify-content-center"
|
||||
} d-flex align-items-center p-0`}
|
||||
>
|
||||
<Box
|
||||
backgroundColor={"gray.300"}
|
||||
style={{
|
||||
position: "absolute",
|
||||
top: 0,
|
||||
width: 2,
|
||||
left: 22,
|
||||
height:
|
||||
i === submenu?.length - 1
|
||||
? "55%"
|
||||
: "120%",
|
||||
borderRadius: "0 0 10px 10px",
|
||||
}}
|
||||
/>
|
||||
<Box
|
||||
backgroundColor={"gray.300"}
|
||||
style={{
|
||||
position: "absolute",
|
||||
width: 10,
|
||||
left: 22,
|
||||
height: 2,
|
||||
}}
|
||||
/>
|
||||
|
||||
<NavLink
|
||||
className={`${
|
||||
isDrawerOpen || openDrawerClick
|
||||
? "p-2 ps-1 ms-2 web-text-medium "
|
||||
: "p-2 ps-0 ms-0 zindex-3 ms-4 web-text-xlarge justify-content-center"
|
||||
} rounded-1 link d-flex align-items-center gap-2 w-100 `}
|
||||
to={link}
|
||||
>
|
||||
{SubIcon && (
|
||||
<SubIcon
|
||||
className="web-text-large ms-2"
|
||||
style={{ zIndex: 111 }}
|
||||
/>
|
||||
)}
|
||||
<Text
|
||||
as={"span"}
|
||||
display={
|
||||
isDrawerOpen || openDrawerClick
|
||||
? "flex"
|
||||
: "none"
|
||||
}
|
||||
alignItems="center"
|
||||
overflow="hidden"
|
||||
>
|
||||
{subMenuTitle === "Aprover Request"
|
||||
? data?.data?.role === "Maker"
|
||||
? "Create Request"
|
||||
: "Aprover Request"
|
||||
: subMenuTitle}
|
||||
</Text>
|
||||
</NavLink>
|
||||
</Box>
|
||||
</Tooltip>
|
||||
)
|
||||
)}
|
||||
</AccordionPanel>
|
||||
</AccordionItem>
|
||||
);
|
||||
} else if (type === "title") {
|
||||
return (
|
||||
<Text
|
||||
as={"span"}
|
||||
key={index}
|
||||
className="web-text-xxsmall fw-600 text-secondary fw-bold"
|
||||
>
|
||||
{title}
|
||||
</Text>
|
||||
);
|
||||
} else if (type === "single") {
|
||||
return (
|
||||
<Tooltip
|
||||
hasArrow
|
||||
bg={"#fff"}
|
||||
fontSize={"xs"}
|
||||
label={title}
|
||||
placement="top-start"
|
||||
color={"blue.800"}
|
||||
>
|
||||
<NavLink
|
||||
key={index}
|
||||
style={{ height: "auto", position: "relative" }}
|
||||
className={`${
|
||||
isDrawerOpen || openDrawerClick
|
||||
? "p-2 web-text-medium"
|
||||
: "p-2 ps-0 web-text-xlarge justify-content-start"
|
||||
} rounded-1 link d-flex align-items-center gap-2 w-100`}
|
||||
to={path}
|
||||
>
|
||||
{Icon && <Icon className="web-text-large ms-2" />}
|
||||
<Text
|
||||
as={"span"}
|
||||
display={
|
||||
isDrawerOpen || openDrawerClick ? "flex" : "none"
|
||||
}
|
||||
alignItems="center"
|
||||
overflow="hidden"
|
||||
>
|
||||
{title}
|
||||
</Text>
|
||||
</NavLink>
|
||||
</Tooltip>
|
||||
);
|
||||
} else {
|
||||
return null;
|
||||
);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
})}
|
||||
)}
|
||||
</Accordion>
|
||||
</Box>
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ import { useGetDepositHistoryQuery } from "../../Services/deposit.request.servic
|
||||
import Pagination from "../../Components/Pagination";
|
||||
import ConfirmModal from "./ConfirmModal";
|
||||
import RejectModal from "./RejectModal";
|
||||
import { useGetBankDepositMasterQuery } from "../../Services/bankdeposit.request.service";
|
||||
|
||||
const formatDate = (date) => {
|
||||
return new Date(date).toLocaleDateString("en-GB", {
|
||||
@@ -78,7 +79,7 @@ const BankDepositRequest = () => {
|
||||
error,
|
||||
refetch,
|
||||
isLoading: depositHistoryLoading,
|
||||
} = useGetDepositHistoryQuery(
|
||||
} = useGetBankDepositMasterQuery(
|
||||
{
|
||||
page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
|
||||
size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
|
||||
@@ -103,10 +104,6 @@ const BankDepositRequest = () => {
|
||||
"Last Name",
|
||||
"Country",
|
||||
"Phone Number",
|
||||
"Deposit Amount",
|
||||
"Deposit Date",
|
||||
"Status",
|
||||
"Supporting's",
|
||||
"Action",
|
||||
];
|
||||
|
||||
@@ -163,6 +160,18 @@ const BankDepositRequest = () => {
|
||||
{generateSerialNumber(idx, currentPage, pageSize)}
|
||||
</Text>
|
||||
),
|
||||
"Request Date": (
|
||||
<Text
|
||||
w={"60px"}
|
||||
justifyContent={slideFromRight ? "right" : "left"}
|
||||
as={"span"}
|
||||
color={"teal.900"}
|
||||
fontWeight={"500"}
|
||||
className="d-flex align-items-center web-text-small"
|
||||
>
|
||||
{formatDate(item?.createdAt)}
|
||||
</Text>
|
||||
),
|
||||
"Client ID": (
|
||||
<Text
|
||||
w={"60px"}
|
||||
@@ -203,81 +212,6 @@ const BankDepositRequest = () => {
|
||||
</Text>
|
||||
</Box>
|
||||
),
|
||||
"Deposit Amount": (
|
||||
<Box isTruncated={true} display={"flex"} justifyContent={"end"}>
|
||||
<Text as={"span"} color={"teal.900"} textAlign={"right"}>
|
||||
{parseFloat(item?.investorAmount || 0).toLocaleString(undefined, {
|
||||
minimumFractionDigits: 2,
|
||||
maximumFractionDigits: 2,
|
||||
})}
|
||||
<Badge ms={1} colorScheme="green">
|
||||
{item?.currencyCode}
|
||||
</Badge>
|
||||
</Text>
|
||||
</Box>
|
||||
),
|
||||
"Deposit Date": (
|
||||
<Text
|
||||
w={"60px"}
|
||||
justifyContent={slideFromRight ? "right" : "left"}
|
||||
as={"span"}
|
||||
color={"teal.900"}
|
||||
fontWeight={"500"}
|
||||
className="d-flex align-items-center web-text-small"
|
||||
>
|
||||
{formatDate(item?.createdAt)}
|
||||
</Text>
|
||||
),
|
||||
Status: (
|
||||
<Box w={"70px"} isTruncated={true} cursor={"pointer"}>
|
||||
<Text
|
||||
as={"span"}
|
||||
color={
|
||||
item.transactionStatus === "Approved" ? "green.500" : "red.500"
|
||||
}
|
||||
fontWeight={700}
|
||||
>
|
||||
{item.transactionStatus}
|
||||
</Text>
|
||||
</Box>
|
||||
),
|
||||
"Supporting's":
|
||||
item.transactionStatus === "Approved" ? (
|
||||
<Text
|
||||
w={"60px"}
|
||||
justifyContent={slideFromRight ? "right" : "left"}
|
||||
as={"span"}
|
||||
color={"teal.900"}
|
||||
fontWeight={"500"}
|
||||
className="d-flex align-items-center web-text-small"
|
||||
>
|
||||
{/* {item?.supporting_FileName} */}
|
||||
<Badge
|
||||
px={2}
|
||||
py={0.5}
|
||||
display={"flex"}
|
||||
alignItems={"center"}
|
||||
textTransform={"inherit"}
|
||||
fontWeight={500}
|
||||
colorScheme={"forestGreen"}
|
||||
>
|
||||
<Link
|
||||
href={import.meta.env.VITE_IMAGE_URL + item?.supporting_FileName}
|
||||
isExternal
|
||||
>
|
||||
<Box as="span" cursor={"pointer"}>
|
||||
View
|
||||
</Box>
|
||||
<ExternalLinkIcon />
|
||||
</Link>
|
||||
{/* <Link to="www.google.com" isExternal>
|
||||
<Box as="span">View</Box> <ExternalLinkIcon />
|
||||
</Link> */}
|
||||
</Badge>
|
||||
</Text>
|
||||
) : (
|
||||
""
|
||||
),
|
||||
Action: (
|
||||
<Box display={"flex"} justifyContent={"center"} gap={2}>
|
||||
<Tooltip
|
||||
|
||||
@@ -20,6 +20,7 @@ import React, { useState } from "react";
|
||||
import * as yup from "yup";
|
||||
import { yupResolver } from "@hookform/resolvers/yup";
|
||||
import { useForm } from "react-hook-form";
|
||||
import ReactQuill from "react-quill";
|
||||
|
||||
export const conformModalSchema = yup.object().shape({
|
||||
fees: yup.string().required("File name is required"),
|
||||
@@ -59,6 +60,18 @@ const ConfirmModal = ({ isOpen, onClose, firstField }) => {
|
||||
setFile(selectedFile);
|
||||
};
|
||||
|
||||
const modules = {
|
||||
toolbar: [
|
||||
// [{ header: "1" }, { header: "2" },
|
||||
// // { font: [] }
|
||||
// ],
|
||||
// [{ size: [] }],
|
||||
["bold", "italic", "underline", "strike", "blockquote"],
|
||||
[{ list: "ordered" }, { list: "bullet" }],
|
||||
["clean"],
|
||||
],
|
||||
};
|
||||
|
||||
return (
|
||||
<Modal isOpen={isOpen} onClose={onClose} initialFocusRef={firstField}>
|
||||
<ModalOverlay />
|
||||
@@ -104,18 +117,17 @@ const ConfirmModal = ({ isOpen, onClose, firstField }) => {
|
||||
size="sm"
|
||||
/>
|
||||
</FormControl>
|
||||
<FormControl mb={4}>
|
||||
<FormControl mb={12}>
|
||||
<FormLabel fontSize="sm" mb={1}>Message</FormLabel>
|
||||
<Textarea rows={5}
|
||||
focusBorderColor='green.400'
|
||||
name="fileName"
|
||||
{...register("fileName")}
|
||||
fontSize="sm"
|
||||
type="textarea"
|
||||
size="md"
|
||||
placeholder={"Enter your comments...."}
|
||||
rounded={'md'}
|
||||
resize={'none'}
|
||||
<ReactQuill
|
||||
theme="snow"
|
||||
style={{
|
||||
height: 150,
|
||||
}}
|
||||
// value={value}
|
||||
// onChange={setValue}
|
||||
modules={modules}
|
||||
placeholder="Start typing here..."
|
||||
/>
|
||||
</FormControl>
|
||||
</Box>}
|
||||
|
||||
@@ -110,7 +110,7 @@ const DepositRequestReject = ({ isOpen, onClose, firstField ,id}) => {
|
||||
<ModalHeader fontSize={"md"}>Investor Comment</ModalHeader>
|
||||
<ModalCloseButton />
|
||||
{isLoading ? (
|
||||
<FullscreenLoaders height={"50vh"} />
|
||||
<FullscreenLoaders height={"50vh"} />
|
||||
) : (
|
||||
<Box as="form" onSubmit={handleSubmit(onSubmit)}>
|
||||
<ModalBody>
|
||||
|
||||
@@ -109,6 +109,7 @@ const DepositHistory = () => {
|
||||
"Deposit Date",
|
||||
"Status",
|
||||
"Supporting's",
|
||||
"Reversal"
|
||||
];
|
||||
|
||||
const handleUpdateStatus = debounce((id) => {
|
||||
@@ -283,6 +284,20 @@ const DepositHistory = () => {
|
||||
) : (
|
||||
""
|
||||
),
|
||||
"Reversal": (
|
||||
<Box isTruncated={true} display={"flex"}>
|
||||
<Badge
|
||||
fontWeight={"500"}
|
||||
textTransform={"none"}
|
||||
color={item?.reversal === false ? "red" : "#FFBB00"}
|
||||
px={2}
|
||||
py={0.5}
|
||||
variant={"ghost"}
|
||||
>
|
||||
{item?.reversal === true ? "Initiate Reversal" : "Under Process"}
|
||||
</Badge>
|
||||
</Box>
|
||||
),
|
||||
}));
|
||||
|
||||
const handleDelete = () => {
|
||||
|
||||
@@ -277,7 +277,7 @@ const EmailNotification = () => {
|
||||
|
||||
<FormControl minH={400} isRequired mb={3} p={1}>
|
||||
<FormLabel fontSize={"sm"}>Create Custom body</FormLabel>
|
||||
<ReactQuill
|
||||
<ReactQuill
|
||||
theme="snow"
|
||||
style={{
|
||||
height: 300,
|
||||
|
||||
@@ -135,6 +135,7 @@ import {
|
||||
"Deposit Amount (BHD)",
|
||||
"Support Image",
|
||||
"Status",
|
||||
"Reversal",
|
||||
];
|
||||
|
||||
const extractedArray = data?.data?.rows?.map((item, idx) => ({
|
||||
@@ -269,6 +270,20 @@ import {
|
||||
</Badge>
|
||||
</Box>
|
||||
),
|
||||
"Reversal": (
|
||||
<Box isTruncated={true} display={"flex"}>
|
||||
<Badge
|
||||
fontWeight={"500"}
|
||||
textTransform={"none"}
|
||||
color={item?.reversal === false ? "red" : "#FFBB00"}
|
||||
px={2}
|
||||
py={0.5}
|
||||
variant={"ghost"}
|
||||
>
|
||||
{item?.reversal === true ? "Initiate Reversal" : "Under Process"}
|
||||
</Badge>
|
||||
</Box>
|
||||
),
|
||||
}));
|
||||
|
||||
const handleDelete = () => {
|
||||
|
||||
@@ -20,6 +20,7 @@ import React, { useState } from "react";
|
||||
import * as yup from "yup";
|
||||
import { yupResolver } from "@hookform/resolvers/yup";
|
||||
import { useForm } from "react-hook-form";
|
||||
import ReactQuill from "react-quill";
|
||||
|
||||
export const conformModalSchema = yup.object().shape({
|
||||
fees: yup.string().required("File name is required"),
|
||||
@@ -59,6 +60,18 @@ const ConfirmModal = ({ isOpen, onClose, firstField }) => {
|
||||
setFile(selectedFile);
|
||||
};
|
||||
|
||||
const modules = {
|
||||
toolbar: [
|
||||
// [{ header: "1" }, { header: "2" },
|
||||
// // { font: [] }
|
||||
// ],
|
||||
// [{ size: [] }],
|
||||
["bold", "italic", "underline", "strike", "blockquote"],
|
||||
[{ list: "ordered" }, { list: "bullet" }],
|
||||
["clean"],
|
||||
],
|
||||
};
|
||||
|
||||
return (
|
||||
<Modal isOpen={isOpen} onClose={onClose} initialFocusRef={firstField}>
|
||||
<ModalOverlay />
|
||||
@@ -104,18 +117,17 @@ const ConfirmModal = ({ isOpen, onClose, firstField }) => {
|
||||
size="sm"
|
||||
/>
|
||||
</FormControl>
|
||||
<FormControl mb={4}>
|
||||
<FormControl mb={12}>
|
||||
<FormLabel fontSize="sm" mb={1}>Message</FormLabel>
|
||||
<Textarea rows={5}
|
||||
focusBorderColor='green.400'
|
||||
name="fileName"
|
||||
{...register("fileName")}
|
||||
fontSize="sm"
|
||||
type="textarea"
|
||||
size="md"
|
||||
placeholder={"Enter your comments...."}
|
||||
rounded={'md'}
|
||||
resize={'none'}
|
||||
<ReactQuill
|
||||
theme="snow"
|
||||
style={{
|
||||
height: 150,
|
||||
}}
|
||||
// value={value}
|
||||
// onChange={setValue}
|
||||
modules={modules}
|
||||
placeholder="Start typing here..."
|
||||
/>
|
||||
</FormControl>
|
||||
</Box>}
|
||||
|
||||
@@ -22,6 +22,7 @@ import {
|
||||
import { TABLE_PAGINATION } from "../../Constants/Paginations";
|
||||
import ConfirmModal from "./ConfirmModal";
|
||||
import RejectModal from "./RejectModal";
|
||||
import { useGetAccountDeletionMasterQuery } from "../../Services/reversal.account.deletion.service";
|
||||
// import { formatDate } from "../../Components/Functions/UTCConvertor";
|
||||
|
||||
const ReversalAccountDeletion = () => {
|
||||
@@ -67,7 +68,7 @@ import RejectModal from "./RejectModal";
|
||||
data: deleteHistory,
|
||||
isLoading,
|
||||
refetch
|
||||
} = useGetDeleteHistoryQuery({
|
||||
} = useGetAccountDeletionMasterQuery({
|
||||
page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
|
||||
size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
|
||||
search: debouncedSearchTerm,
|
||||
@@ -93,12 +94,12 @@ import RejectModal from "./RejectModal";
|
||||
// ====================================================[Table Setup]================================================================
|
||||
const tableHeadRow = [
|
||||
"Sr No.",
|
||||
"Request On",
|
||||
"Request Date",
|
||||
"Client ID",
|
||||
"First Name",
|
||||
"Last Name",
|
||||
"Country",
|
||||
"Phone Number",
|
||||
"Country",
|
||||
"Action"
|
||||
];
|
||||
|
||||
@@ -115,7 +116,7 @@ import RejectModal from "./RejectModal";
|
||||
{index + 1}.
|
||||
</Text>
|
||||
),
|
||||
"Request On": (
|
||||
"Request Date": (
|
||||
<Text
|
||||
justifyContent={slideFromRight ? "right" : "left"}
|
||||
as={"span"}
|
||||
@@ -160,17 +161,6 @@ import RejectModal from "./RejectModal";
|
||||
{item.lastName}
|
||||
</Text>
|
||||
),
|
||||
"Country": (
|
||||
<Text
|
||||
justifyContent={slideFromRight ? "right" : "left"}
|
||||
as={"span"}
|
||||
color={"gray.600"}
|
||||
className="d-flex align-items-center web-text-small"
|
||||
fontWeight={'500'}
|
||||
>
|
||||
{item.country}
|
||||
</Text>
|
||||
),
|
||||
"Phone Number": (
|
||||
<Text
|
||||
justifyContent={slideFromRight ? "right" : "left"}
|
||||
@@ -182,6 +172,17 @@ import RejectModal from "./RejectModal";
|
||||
{item.phoneNumber}
|
||||
</Text>
|
||||
),
|
||||
"Country": (
|
||||
<Text
|
||||
justifyContent={slideFromRight ? "right" : "left"}
|
||||
as={"span"}
|
||||
color={"gray.600"}
|
||||
className="d-flex align-items-center web-text-small"
|
||||
fontWeight={'500'}
|
||||
>
|
||||
{item.country}
|
||||
</Text>
|
||||
),
|
||||
"Action": (
|
||||
<Box display={"flex"} justifyContent={"center"} gap={2}>
|
||||
<Tooltip
|
||||
|
||||
@@ -20,6 +20,7 @@ import React, { useState } from "react";
|
||||
import * as yup from "yup";
|
||||
import { yupResolver } from "@hookform/resolvers/yup";
|
||||
import { useForm } from "react-hook-form";
|
||||
import ReactQuill from "react-quill";
|
||||
|
||||
export const conformModalSchema = yup.object().shape({
|
||||
fees: yup.string().required("File name is required"),
|
||||
@@ -57,7 +58,19 @@ const ConfirmModal = ({ isOpen, onClose, firstField }) => {
|
||||
const handleFileChange = (event) => {
|
||||
const selectedFile = event.target.files[0];
|
||||
setFile(selectedFile);
|
||||
};
|
||||
};
|
||||
|
||||
const modules = {
|
||||
toolbar: [
|
||||
// [{ header: "1" }, { header: "2" },
|
||||
// // { font: [] }
|
||||
// ],
|
||||
// [{ size: [] }],
|
||||
["bold", "italic", "underline", "strike", "blockquote"],
|
||||
[{ list: "ordered" }, { list: "bullet" }],
|
||||
["clean"],
|
||||
],
|
||||
};
|
||||
|
||||
return (
|
||||
<Modal isOpen={isOpen} onClose={onClose} initialFocusRef={firstField}>
|
||||
@@ -104,18 +117,17 @@ const ConfirmModal = ({ isOpen, onClose, firstField }) => {
|
||||
size="sm"
|
||||
/>
|
||||
</FormControl>
|
||||
<FormControl mb={4}>
|
||||
<FormControl mb={12}>
|
||||
<FormLabel fontSize="sm" mb={1}>Message</FormLabel>
|
||||
<Textarea rows={5}
|
||||
focusBorderColor='green.400'
|
||||
name="fileName"
|
||||
{...register("fileName")}
|
||||
fontSize="sm"
|
||||
type="textarea"
|
||||
size="md"
|
||||
placeholder={"Enter your comments...."}
|
||||
rounded={'md'}
|
||||
resize={'none'}
|
||||
<ReactQuill
|
||||
theme="snow"
|
||||
style={{
|
||||
height: 150,
|
||||
}}
|
||||
// value={value}
|
||||
// onChange={setValue}
|
||||
modules={modules}
|
||||
placeholder="Start typing here..."
|
||||
/>
|
||||
</FormControl>
|
||||
</Box>}
|
||||
|
||||
@@ -25,6 +25,7 @@ import { OPACITY_ON_LOAD } from "../../Layout/animations";
|
||||
import { useGetFawateerForMakerRequestQuery } from "../../Services/fawateer.request.service";
|
||||
import ConfirmModal from "./ConfirmModal";
|
||||
import RejectModal from "./RejectModal";
|
||||
import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawateer.deposit.service";
|
||||
|
||||
const ReversalFawateerDeposit = () => {
|
||||
const toast = useToast();
|
||||
@@ -65,7 +66,7 @@ import RejectModal from "./RejectModal";
|
||||
isLoading: drawalRequestLoading,
|
||||
error,
|
||||
refetch
|
||||
} = useGetFawateerForMakerRequestQuery(
|
||||
} = useGetFawateerDepositMasterQuery(
|
||||
{
|
||||
page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
|
||||
size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
|
||||
@@ -124,14 +125,12 @@ import RejectModal from "./RejectModal";
|
||||
// ====================================================[Table Setup]================================================================
|
||||
const tableHeadRow = [
|
||||
"Sr.no",
|
||||
"Request Date",
|
||||
"Client ID",
|
||||
"First Name",
|
||||
"Last Name",
|
||||
"E-mail ID",
|
||||
"Phone Number",
|
||||
"Deposit Date",
|
||||
"Deposit Amount (BHD)",
|
||||
"Support Image",
|
||||
"Country",
|
||||
"Action",
|
||||
];
|
||||
|
||||
@@ -150,6 +149,18 @@ import RejectModal from "./RejectModal";
|
||||
{generateSerialNumber(idx, currentPage, pageSize)}
|
||||
</Text>
|
||||
),
|
||||
"Request Date": (
|
||||
<Text
|
||||
w={"60px"}
|
||||
justifyContent={slideFromRight ? "right" : "left"}
|
||||
as={"span"}
|
||||
color={"teal.900"}
|
||||
fontWeight={"500"}
|
||||
className="d-flex align-items-center web-text-small"
|
||||
>
|
||||
{formatDate(item?.createdAt)}
|
||||
</Text>
|
||||
),
|
||||
"Client ID": (
|
||||
<Text
|
||||
w={"60px"}
|
||||
@@ -176,10 +187,10 @@ import RejectModal from "./RejectModal";
|
||||
</Text>
|
||||
</Box>
|
||||
),
|
||||
"E-mail ID": (
|
||||
<Box isTruncated={true}>
|
||||
"Country": (
|
||||
<Box w={"50px"} isTruncated={true}>
|
||||
<Text as={"span"} color={"teal.900"}>
|
||||
{item.emailAddress}
|
||||
{item.lastName}
|
||||
</Text>
|
||||
</Box>
|
||||
),
|
||||
@@ -190,61 +201,6 @@ import RejectModal from "./RejectModal";
|
||||
</Text>
|
||||
</Box>
|
||||
),
|
||||
"Deposit Date": (
|
||||
<Box
|
||||
w={"100px"}
|
||||
isTruncated={true}
|
||||
display={"flex"}
|
||||
>
|
||||
<Text as={"span"} color={"teal.900"}>
|
||||
{formatDate(item?.transaction_date)}
|
||||
</Text>
|
||||
</Box>
|
||||
),
|
||||
"Deposit Amount (BHD)": (
|
||||
<Box w={"130px"} isTruncated={true} display={"flex"}>
|
||||
<Text as={"span"} color={"teal.900"}>
|
||||
{/* {item.investorAmount} */}
|
||||
{parseFloat(item?.transaction_amount || 0).toLocaleString(undefined, {
|
||||
minimumFractionDigits: 2,
|
||||
maximumFractionDigits: 2,
|
||||
})}
|
||||
{/* <Badge ms={1} colorScheme="green">{item?.transaction_amount}</Badge> */}
|
||||
</Text>
|
||||
</Box>
|
||||
),
|
||||
"Support Image": (
|
||||
<Text
|
||||
color={"green.500"}
|
||||
justifyContent={slideFromRight ? "right" : "left"}
|
||||
as={"span"}
|
||||
fontWeight={"500"}
|
||||
className="d-flex align-items-center web-text-small"
|
||||
>
|
||||
{item?.spportFile_path&&<Badge
|
||||
px={2}
|
||||
py={0.5}
|
||||
textTransform={"inherit"}
|
||||
fontWeight={500}
|
||||
colorScheme={"forestGreen"}
|
||||
>
|
||||
<Link
|
||||
href={import.meta.env.VITE_IMAGE_URL + item?.spportFile_path}
|
||||
isExternal
|
||||
display={"flex"}
|
||||
alignItems={"center"}
|
||||
>
|
||||
<Box me={"1px"}
|
||||
as="span"
|
||||
cursor={"pointer"}
|
||||
>
|
||||
View
|
||||
</Box>
|
||||
<ExternalLinkIcon />
|
||||
</Link>
|
||||
</Badge>}
|
||||
</Text>
|
||||
),
|
||||
Action: (
|
||||
<Box display={"flex"} justifyContent={"center"} gap={2}>
|
||||
<Tooltip
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
TbReportMoney,
|
||||
} from "react-icons/tb";
|
||||
import {
|
||||
RiAccountBoxLine,
|
||||
RiBankLine,
|
||||
RiFileUserLine,
|
||||
RiMoneyDollarBoxLine,
|
||||
@@ -205,14 +206,14 @@ export const nav = [
|
||||
{
|
||||
title: "Fawateer Deposit",
|
||||
type: "single",
|
||||
path: "/fawateer-deposit",
|
||||
Icon: TbLayoutDashboard,
|
||||
path: "/reversal-fawateer-deposit",
|
||||
Icon: HiOutlineBanknotes,
|
||||
},
|
||||
{
|
||||
title: "Account Deletion Request",
|
||||
type: "single",
|
||||
path: "/account-deletion-request",
|
||||
Icon: TbLayoutDashboard,
|
||||
Icon: RiAccountBoxLine,
|
||||
},
|
||||
|
||||
|
||||
|
||||
@@ -137,7 +137,7 @@ export const RouteLink = [
|
||||
// ===============[ REVERSAL TRANSACTION ]===============
|
||||
|
||||
{ path: "/bank-deposit-request", Component: BankDepositRequest },
|
||||
{ path: "/fawateer-deposit", Component: ReversalFawateerDeposit },
|
||||
{ path: "/reversal-fawateer-deposit", Component: ReversalFawateerDeposit },
|
||||
{ path: "/account-deletion-request", Component: ReversalAccountDeletion },
|
||||
|
||||
|
||||
|
||||
35
src/Services/bankdeposit.request.service.js
Normal file
35
src/Services/bankdeposit.request.service.js
Normal file
@@ -0,0 +1,35 @@
|
||||
// Need to use the React-specific entry point to import createApi
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const bankDepositRequestMaster = createApi({
|
||||
reducerPath: "BankDeposit",
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getBankDeposit"],
|
||||
endpoints: (builder) => ({
|
||||
// ======[Get All]=====
|
||||
|
||||
getBankDepositMaster: builder.query({
|
||||
query: () => `/reversal-transactions/bank-transfer/getAll`,
|
||||
providesTags: ["getBankDeposit"],
|
||||
}),
|
||||
|
||||
|
||||
depositReject: builder.mutation({
|
||||
query: ({ id, data }) => ({
|
||||
url: `/deposit/admin/rejected/${id}`,
|
||||
method: "PATCH",
|
||||
body: data,
|
||||
}),
|
||||
invalidatesTags: ["getDepositRequest", "getDepositHistory"],
|
||||
}),
|
||||
|
||||
|
||||
}),
|
||||
});
|
||||
|
||||
export const {
|
||||
useGetBankDepositMasterQuery,
|
||||
useDepositRejectMutation,
|
||||
} = bankDepositRequestMaster;
|
||||
@@ -88,7 +88,7 @@ export const depositRequest = createApi({
|
||||
// Export hooks for usage in functional components
|
||||
export const {
|
||||
useGetDepositRequestQuery,
|
||||
useGetDepositRequestByIdQuery,
|
||||
useGetDepositRequestByIdQuery,
|
||||
useUpdateDepositRequestMutation,
|
||||
useDepositRejectMutation,
|
||||
useGetDepositHistoryQuery,
|
||||
|
||||
22
src/Services/reversal.account.deletion.service.js
Normal file
22
src/Services/reversal.account.deletion.service.js
Normal file
@@ -0,0 +1,22 @@
|
||||
// Need to use the React-specific entry point to import createApi
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const reversalAccountDeletionMaster = createApi({
|
||||
reducerPath: "accountDeletion",
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getAccountDeletion"],
|
||||
endpoints: (builder) => ({
|
||||
// ======[Get All]=====
|
||||
|
||||
getAccountDeletionMaster: builder.query({
|
||||
query: () => `/reversal-transactions/account-deletion/getAll`,
|
||||
providesTags: ["getAccountDeletion"],
|
||||
}),
|
||||
}),
|
||||
});
|
||||
|
||||
export const {
|
||||
useGetAccountDeletionMasterQuery,
|
||||
} = reversalAccountDeletionMaster;
|
||||
22
src/Services/reversal.fawateer.deposit.service.js
Normal file
22
src/Services/reversal.fawateer.deposit.service.js
Normal file
@@ -0,0 +1,22 @@
|
||||
// Need to use the React-specific entry point to import createApi
|
||||
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
||||
import { baseQuery } from "./token.serivce";
|
||||
|
||||
// Define a service using a base URL and expected endpoints
|
||||
export const reversalFawateerDepositMaster = createApi({
|
||||
reducerPath: "FawateerDeposit",
|
||||
baseQuery: baseQuery,
|
||||
tagTypes: ["getFawateerDeposit"],
|
||||
endpoints: (builder) => ({
|
||||
// ======[Get All]=====
|
||||
|
||||
getFawateerDepositMaster: builder.query({
|
||||
query: () => `/reversal-transactions/bank-transfer/getAll`,
|
||||
providesTags: ["getFawateerDeposit"],
|
||||
}),
|
||||
}),
|
||||
});
|
||||
|
||||
export const {
|
||||
useGetFawateerDepositMasterQuery,
|
||||
} = reversalFawateerDepositMaster;
|
||||
@@ -21,6 +21,9 @@ import { sabAdminMaster } from "../Services/subadmin.service";
|
||||
import { changePasswordMake } from "../Services/change.password.service";
|
||||
import { forgetPasswordMake } from "../Services/forget.password.service";
|
||||
import { dashboardMaster } from "../Services/dashboard.service";
|
||||
import { bankDepositRequestMaster } from "../Services/bankdeposit.request.service";
|
||||
import { reversalFawateerDepositMaster } from "../Services/reversal.fawateer.deposit.service";
|
||||
import { reversalAccountDeletionMaster } from "../Services/reversal.account.deletion.service";
|
||||
|
||||
export const store = configureStore({
|
||||
reducer: {
|
||||
@@ -43,6 +46,9 @@ export const store = configureStore({
|
||||
[changePasswordMake.reducerPath]: changePasswordMake.reducer,
|
||||
[forgetPasswordMake.reducerPath]: forgetPasswordMake.reducer,
|
||||
[dashboardMaster.reducerPath]: dashboardMaster.reducer,
|
||||
[bankDepositRequestMaster.reducerPath]: bankDepositRequestMaster.reducer,
|
||||
[reversalFawateerDepositMaster.reducerPath]: reversalFawateerDepositMaster.reducer,
|
||||
[reversalAccountDeletionMaster.reducerPath]: reversalAccountDeletionMaster.reducer,
|
||||
|
||||
// Add other reducers as needed
|
||||
},
|
||||
@@ -71,6 +77,9 @@ export const store = configureStore({
|
||||
changePasswordMake.middleware,
|
||||
forgetPasswordMake.middleware,
|
||||
dashboardMaster.middleware,
|
||||
bankDepositRequestMaster.middleware,
|
||||
reversalFawateerDepositMaster.middleware,
|
||||
reversalAccountDeletionMaster.middleware,
|
||||
),
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user