From 57c6923784f500f334954396a0f1431a69a5f5f7 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Thu, 9 Jan 2025 17:40:55 +0530
Subject: [PATCH 01/50] =?UTF-8?q?[dashboard=20working=F0=9F=91=B7=E2=80=8D?=
=?UTF-8?q?=E2=99=82=EF=B8=8F]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Pages/{Dashbaord.jsx => DashbaordOld.jsx} | 6 --
src/Pages/Dashboard/Dashbaord.jsx | 93 +++++++++++++++++++
src/Routes/Nav.js | 12 +--
src/Routes/Routes.js | 4 +-
4 files changed, 101 insertions(+), 14 deletions(-)
rename src/Pages/{Dashbaord.jsx => DashbaordOld.jsx} (99%)
create mode 100644 src/Pages/Dashboard/Dashbaord.jsx
diff --git a/src/Pages/Dashbaord.jsx b/src/Pages/DashbaordOld.jsx
similarity index 99%
rename from src/Pages/Dashbaord.jsx
rename to src/Pages/DashbaordOld.jsx
index 1ed8b29..692892b 100644
--- a/src/Pages/Dashbaord.jsx
+++ b/src/Pages/DashbaordOld.jsx
@@ -135,9 +135,6 @@ const Dashbaord = () => {
-
-
-
IO Status
@@ -151,9 +148,6 @@ const Dashbaord = () => {
-
-
-
)
diff --git a/src/Pages/Dashboard/Dashbaord.jsx b/src/Pages/Dashboard/Dashbaord.jsx
new file mode 100644
index 0000000..4957d33
--- /dev/null
+++ b/src/Pages/Dashboard/Dashbaord.jsx
@@ -0,0 +1,93 @@
+import { Box, Divider, Flex, Grid, GridItem, Heading, SimpleGrid, Text } from '@chakra-ui/react'
+import React from 'react'
+import { BsBoxArrowDown, BsBoxArrowUp } from "react-icons/bs";
+import { LuContact } from "react-icons/lu";
+import { FaRegPenToSquare } from "react-icons/fa6";
+
+const panddingReguest = [
+ {
+ icon: ,
+ label: "Pending deposit requests",
+ count: 27,
+ },
+ {
+ icon: ,
+ label: "Pending withdrawal requests",
+ count: 27,
+ },
+ {
+ icon: ,
+ label: "Pending KYC review request",
+ count: 27,
+ },
+ {
+ icon: ,
+ label: "Pending Acc modification request",
+ count: 27,
+ },
+];
+
+const userActivity = [
+ {
+ icon: ,
+ label: "Total number of users",
+ count: 27,
+ },
+ {
+ icon: ,
+ label: "Total number of users with completed KYC (%)",
+ count: 27,
+ },
+ {
+ icon: ,
+ label: "Total number of Active users",
+ count: 27,
+ },
+];
+
+const Dashbaord = () => {
+ return (
+
+
+
+ Pending Request
+
+
+ {panddingReguest.map((item, index) => (
+
+ {item.icon}
+
+ {item.label}
+
+
+ {item.count}
+
+
+ ))}
+
+
+
+ Pending Request
+
+
+ {userActivity.map((item, index) => (
+
+
+ {item.icon}
+
+ {item.label}
+
+
+
+ {item.count}
+
+
+ ))}
+
+
+
+
+ )
+}
+
+export default Dashbaord
diff --git a/src/Routes/Nav.js b/src/Routes/Nav.js
index 76bf644..d01b988 100644
--- a/src/Routes/Nav.js
+++ b/src/Routes/Nav.js
@@ -34,12 +34,12 @@ import { HiOutlineBanknotes } from "react-icons/hi2";
import { AtSignIcon } from "@chakra-ui/icons";
export const nav = [
- // {
- // title: "Dashboard",
- // type: "single",
- // path: "/",
- // Icon: TbLayoutDashboard,
- // },
+ {
+ title: "Dashboard",
+ type: "single",
+ path: "/dashboard",
+ Icon: TbLayoutDashboard,
+ },
{
title: "MASTER MENU",
type: "title",
diff --git a/src/Routes/Routes.js b/src/Routes/Routes.js
index 5115a51..09bdf6e 100644
--- a/src/Routes/Routes.js
+++ b/src/Routes/Routes.js
@@ -31,7 +31,7 @@ import DepositRequest from "../Pages/Deposit/DepositRequest/DepositRequest";
import EditBankDetails from "../Pages/Admin/BankDetails/EditBankDetails";
import ExchangeHistory from "../Pages/Master/ExchangeRate/ExchangeHistroy";
import Welcome from "../Pages/PaymentSuccess";
-import Dashbaord from "../Pages/Dashbaord";
+import Dashbaord from "../Pages/Dashboard/Dashbaord";
import UnderConstruction from "../Pages/UnderConstruction";
import PendingRequest from "../Pages/WithDrawal/DrawalRequest/PendingRequest";
import BankInvestor from "../Pages/Admin/Investor/BankInvestor/BankInvestor";
@@ -53,7 +53,7 @@ export const RouteLink = [
// =============[ Tanami ]================
// ===============[ Management]===============
- { path: "/", Component: Sponser },
+ { path: "/", Component: Dashbaord },
{ path: "/sponser", Component: Sponser },
{ path: "/sponser/add-sponser/:id", Component: AddSponser },
{ path: "/sponser/add-sponser", Component: AddSponser },
From 96f8c3248338fa8ad1ff35cf327915c3e28ca970 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Thu, 9 Jan 2025 19:31:52 +0530
Subject: [PATCH 02/50] working
---
src/Pages/Dashboard/Dashbaord.jsx | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/src/Pages/Dashboard/Dashbaord.jsx b/src/Pages/Dashboard/Dashbaord.jsx
index 4957d33..91672f7 100644
--- a/src/Pages/Dashboard/Dashbaord.jsx
+++ b/src/Pages/Dashboard/Dashbaord.jsx
@@ -31,17 +31,18 @@ const userActivity = [
{
icon: ,
label: "Total number of users",
- count: 27,
+ count: 1500,
},
{
icon: ,
label: "Total number of users with completed KYC (%)",
- count: 27,
+ count: '320',
+ percentage:'(50%)',
},
{
icon: ,
label: "Total number of Active users",
- count: 27,
+ count: '3,298',
},
];
@@ -55,11 +56,11 @@ const Dashbaord = () => {
{panddingReguest.map((item, index) => (
- {item.icon}
-
+ {item.icon}
+
{item.label}
-
+
{item.count}
@@ -74,12 +75,12 @@ const Dashbaord = () => {
{item.icon}
-
+
{item.label}
-
- {item.count}
+
+ {item.count} {item.percentage}
))}
From aeb0f25663a1d075798215e6713eae47b721c98a Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Fri, 10 Jan 2025 14:53:55 +0530
Subject: [PATCH 03/50] =?UTF-8?q?kaam=20chalu=20hai=F0=9F=98=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Pages/Dashboard/Dashbaord.jsx | 47 +++++++++++++++++++++++++------
1 file changed, 39 insertions(+), 8 deletions(-)
diff --git a/src/Pages/Dashboard/Dashbaord.jsx b/src/Pages/Dashboard/Dashbaord.jsx
index 91672f7..4f51092 100644
--- a/src/Pages/Dashboard/Dashbaord.jsx
+++ b/src/Pages/Dashboard/Dashbaord.jsx
@@ -1,4 +1,4 @@
-import { Box, Divider, Flex, Grid, GridItem, Heading, SimpleGrid, Text } from '@chakra-ui/react'
+import { Box, Divider, Flex, Grid, GridItem, Heading, HStack, Select, SimpleGrid, Stack, Text } from '@chakra-ui/react'
import React from 'react'
import { BsBoxArrowDown, BsBoxArrowUp } from "react-icons/bs";
import { LuContact } from "react-icons/lu";
@@ -50,14 +50,14 @@ const Dashbaord = () => {
return (
-
+
Pending Request
{panddingReguest.map((item, index) => (
-
+
{item.icon}
-
+
{item.label}
@@ -67,15 +67,15 @@ const Dashbaord = () => {
))}
-
- Pending Request
+
+ Pending Request
{userActivity.map((item, index) => (
-
+
{item.icon}
-
+
{item.label}
@@ -85,6 +85,37 @@ const Dashbaord = () => {
))}
+
+
+
+ 80%
+ Users that opened the app today
+
+
+
+ 3,298
+ New sign-ups
+
+
+
+
+
+
+ 80%
+ New KYC verification
+
+
+
+ 3,298
+ Users who logged in
+
+
+
+
From 96a302d26281421f447c967beab59bd648ad5a6d Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Mon, 13 Jan 2025 19:09:57 +0530
Subject: [PATCH 04/50] =?UTF-8?q?Dashboard=20Working=F0=9F=91=B7=E2=80=8D?=
=?UTF-8?q?=E2=99=82=EF=B8=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Contexts/GlobalStateProvider.jsx | 77 +++++++-
src/Layout/DefaultLayout.jsx | 7 +
src/Pages/Dashboard/Dashbaord.jsx | 168 ++++++++++++++----
.../Dashboard/InvestmentOpportunities.jsx | 161 +++++++++++++++++
src/Routes/Routes.js | 2 +
5 files changed, 382 insertions(+), 33 deletions(-)
create mode 100644 src/Pages/Dashboard/InvestmentOpportunities.jsx
diff --git a/src/Contexts/GlobalStateProvider.jsx b/src/Contexts/GlobalStateProvider.jsx
index b172727..4ecd2b8 100644
--- a/src/Contexts/GlobalStateProvider.jsx
+++ b/src/Contexts/GlobalStateProvider.jsx
@@ -6,7 +6,7 @@ import { v4 as uuidv4 } from "uuid";
import { TbClock2 } from "react-icons/tb";
import { CiWallet } from "react-icons/ci";
import { HiOutlineReceiptPercent } from "react-icons/hi2";
-import { IoMdQrScanner } from "react-icons/io";
+import { IoMdQrScanner } from "react-icons/io";
import { GrDocumentPdf } from "react-icons/gr";
import { AiOutlineFileGif } from "react-icons/ai";
@@ -1674,6 +1674,79 @@ const GlobalStateProvider = ({ children }) => {
},
]);
+ const [opportunities, setOpportunities] = useState([
+ {
+ id: 1,
+ Investors: "Blackstone",
+ amountRemaining: "10 %",
+ totalDealsize: "$ 520",
+ noViews: "50",
+ },
+ {
+ id: 2,
+ Investors: "Blackstone",
+ amountRemaining: "10 %",
+ totalDealsize: "$ 520",
+ noViews: "50",
+ },
+ {
+ id: 3,
+ Investors: "Blackstone",
+ amountRemaining: "10 %",
+ totalDealsize: "$ 520",
+ noViews: "50",
+ },
+ {
+ id: 4,
+ Investors: "Blackstone",
+ amountRemaining: "10 %",
+ totalDealsize: "$ 520",
+ noViews: "50",
+ },
+ {
+ id: 5,
+ Investors: "Blackstone",
+ amountRemaining: "10 %",
+ totalDealsize: "$ 520",
+ noViews: "50",
+ },
+ {
+ id: 6,
+ Investors: "Blackstone",
+ amountRemaining: "10 %",
+ totalDealsize: "$ 520",
+ noViews: "50",
+ },
+ {
+ id: 7,
+ Investors: "Blackstone",
+ amountRemaining: "10 %",
+ totalDealsize: "$ 520",
+ noViews: "50",
+ },
+ {
+ id: 8,
+ Investors: "Blackstone",
+ amountRemaining: "10 %",
+ totalDealsize: "$ 520",
+ noViews: "50",
+ },
+ {
+ id: 9,
+ Investors: "Blackstone",
+ amountRemaining: "10 %",
+ totalDealsize: "$ 520",
+ noViews: "50",
+ },
+ {
+ id: 10,
+ Investors: "Blackstone",
+ amountRemaining: "10 %",
+ totalDealsize: "$ 520",
+ noViews: "50",
+ },
+ ]);
+
const [InvestorWallet, setInvestorWallet] = useState(null);
// ==============[ prod state ]===============================
@@ -1767,6 +1840,8 @@ const GlobalStateProvider = ({ children }) => {
setIONAVDetail,
iOTransaction,
setIOTransaction,
+ opportunities,
+ setOpportunities,
}}
>
{children}
diff --git a/src/Layout/DefaultLayout.jsx b/src/Layout/DefaultLayout.jsx
index f615b1e..d74a08b 100644
--- a/src/Layout/DefaultLayout.jsx
+++ b/src/Layout/DefaultLayout.jsx
@@ -38,6 +38,7 @@ import {
RiMoneyDollarBoxLine,
} from "react-icons/ri";
import {
+ TbLayoutDashboard,
TbListDetails,
TbReportMoney,
TbTransactionDollar
@@ -139,6 +140,12 @@ const DashboardLayout = ({ isOnline }) => {
switch (true) {
case "/":
return "👋🏻 Hi, Admin";
+ case path.startsWith("/investment-opportunities"):
+ return (
+
+ dashboard / Open Opportunities
+
+ );
case path.startsWith("/sponser"):
return (
diff --git a/src/Pages/Dashboard/Dashbaord.jsx b/src/Pages/Dashboard/Dashbaord.jsx
index 4f51092..833ff84 100644
--- a/src/Pages/Dashboard/Dashbaord.jsx
+++ b/src/Pages/Dashboard/Dashbaord.jsx
@@ -1,8 +1,10 @@
import { Box, Divider, Flex, Grid, GridItem, Heading, HStack, Select, SimpleGrid, Stack, Text } from '@chakra-ui/react'
import React from 'react'
-import { BsBoxArrowDown, BsBoxArrowUp } from "react-icons/bs";
+import { BsArrowsAngleContract, BsBoxArrowDown, BsBoxArrowUp } from "react-icons/bs";
import { LuContact } from "react-icons/lu";
import { FaRegPenToSquare } from "react-icons/fa6";
+import InvestmentOpportunities from './InvestmentOpportunities';
+import { Link } from 'react-router-dom';
const panddingReguest = [
{
@@ -46,21 +48,54 @@ const userActivity = [
},
];
-const Dashbaord = () => {
+const closedOpportunities = [
+ {
+ icon: ,
+ label: "Closed Opportunities",
+ count: 27,
+ },
+ {
+ icon: ,
+ label: "Total assets under managemnet",
+ count: 27,
+ },
+ {
+ icon: ,
+ label: "Total number of investors",
+ count: 27,
+ },
+ {
+ icon: ,
+ label: "Total number of unique investors",
+ count: 27,
+ },
+];
+
+const walletCase = [
+ { amount: "$ د. ب. 50,000", currency: "USD" },
+ { amount: "$ د. ب. 50,000", currency: "BHD" },
+ { amount: "$ ﷼. 50,000", currency: "SAR" },
+ { amount: "$ د.ك 50,0000", currency: "KWD" },
+ { amount: "$ د.إ 50,000", currency: "AED" },
+ { amount: "$ ﷼ 50,000", currency: "OMR" },
+ { amount: "$ ر. ق 50,000" , currency: "QAR" },
+];
+
+const Dashbaord = ({ showSearch = false }) => {
return (
-
-
+
+
Pending Request
-
+
{panddingReguest.map((item, index) => (
{item.icon}
-
+
{item.label}
-
+
{item.count}
@@ -68,56 +103,125 @@ const Dashbaord = () => {
- Pending Request
+ User Activity
-
+
{userActivity.map((item, index) => (
{item.icon}
-
+
{item.label}
-
+
{item.count} {item.percentage}
))}
-
-
-
- 80%
- Users that opened the app today
-
-
-
- 3,298
- New sign-ups
-
-
-
-
-
+
+
+
+
80%
- New KYC verification
+ Users that opened the app today
3,298
- Users who logged in
+ New sign-ups
+
+
+
+
+
+
+
+
+
+ 80%
+ New KYC verification
+
+
+
+ 3,298
+ Users who logged in
+
+
+ Investment Opportunities
+
+
+
+ Open Opportunities
+
+
+
+
+
+
+
+ {closedOpportunities.map((item, index) => (
+
+
+ {item.icon}
+
+ {item.label}
+
+
+
+ {item.count}
+
+
+ ))}
+
+
+
+ Wallet Balances
+
+
+ $ 50,000
+ TOTAL CASH AVAILABLE ACROSS ALL WALLETS USD
+
+ Sum of users available wallet cash in
+
+ {walletCase.slice(0, 4).map((item, index) => (
+
+
+ {item.amount}
+
+
+ {item.currency}
+
+
+ ))}
+
+
+
+ {walletCase.slice(4).map((item, index) => (
+
+
+ {item.amount}
+
+
+ {item.currency}
+
+
+ ))}
+
+
+
)
}
diff --git a/src/Pages/Dashboard/InvestmentOpportunities.jsx b/src/Pages/Dashboard/InvestmentOpportunities.jsx
new file mode 100644
index 0000000..260334a
--- /dev/null
+++ b/src/Pages/Dashboard/InvestmentOpportunities.jsx
@@ -0,0 +1,161 @@
+import {
+ Box,
+ HStack,
+ Input,
+ Select,
+ Text,
+ useToast,
+ } from "@chakra-ui/react";
+ import React, { useContext, useEffect, useState, useRef } from "react";
+import { OPACITY_ON_LOAD } from "../../Layout/animations";
+import GlobalStateContext from "../../Contexts/GlobalStateContext";
+import CustomAlertDialog from "../../Components/CustomAlertDialog";
+import NormalTable from "../../Components/DataTable/NormalTable";
+
+ const formatDate = (date) => new Date(date).toLocaleDateString();
+
+ const InvestmentOpportunities = ({ showSearch = true }) => {
+ const toast = useToast();
+ const { opportunities, setOpportunities, slideFromRight } =
+ useContext(GlobalStateContext);
+ const [searchTerm, setSearchTerm] = useState("");
+ const [isLoading, setIsLoading] = useState(true);
+ const [deleteAlert, setDeleteAlert] = useState(false);
+ const [actionId, setActionId] = useState(false);
+
+ // const {
+ // data: bankDetails,
+ // isLoading: bankDetailsLoading,
+ // error,
+ // } = useGetBankQuery({ page: 1, size: 10 });
+
+ useEffect(() => {
+ // Simulate loading
+ const timer = setTimeout(() => {
+ setIsLoading(false);
+ }, 1500);
+
+ // Cleanup the timer on component unmount
+ return () => clearTimeout(timer);
+ }, []);
+
+ // ====================================================[Table Setup]================================================================
+ const tableHeadRow = [
+ "Sr N/O",
+ "Investors",
+ "Amount remaining %",
+ "Total deal size",
+ //
+ // Total deal size
+ //
+ // ,
+ "No of views",
+ ];
+
+ // ====================================================[Table Filter]================================================================
+ const filteredData = opportunities?.filter((item) => {
+ // Filter by name (case insensitive)
+ const name = item.Investors;
+ const searchLower = searchTerm.toLowerCase();
+ const nameMatches = name?.toLowerCase().includes(searchLower);
+
+ return nameMatches;
+ });
+
+
+ const extractedArray = filteredData?.map((item,index) => ({
+ id: item?.id,
+ "Sr N/O": (
+
+ {item.id}
+
+ ),
+ "Investors": (
+
+
+ {item?.Investors}
+
+
+ ),
+ "Amount remaining %": (
+
+
+ {item?.amountRemaining}
+
+
+ ),
+ "Total deal size": (
+
+
+ {item?.totalDealsize}
+
+
+ ),
+ "No of views": (
+
+
+ {item.noViews}
+
+
+ ),
+ }));
+
+ return (
+
+
+ {showSearch && (
+
+ setSearchTerm(e.target.value)}
+ />
+
+ )}
+
+
+
+
+ setDeleteAlert(false)}
+ isOpen={deleteAlert}
+ message={"Are you sure you want to delete sponers?"}
+ isLoading={isLoading}
+ />
+
+ );
+ };
+
+ export default InvestmentOpportunities;
+
\ No newline at end of file
diff --git a/src/Routes/Routes.js b/src/Routes/Routes.js
index 09bdf6e..a366cf6 100644
--- a/src/Routes/Routes.js
+++ b/src/Routes/Routes.js
@@ -48,12 +48,14 @@ import AddUser from "../Pages/User/AddUser";
import Profile from "../Pages/Profile/Profile";
import SubAdmin from "../Pages/SubAdmin/SubAdmin";
import SubAdminUpdateCreate from "../Pages/SubAdmin/SubAdminUpdateCreate";
+import InvestmentOpportunities from "../Pages/Dashboard/InvestmentOpportunities";
export const RouteLink = [
// =============[ Tanami ]================
// ===============[ Management]===============
{ path: "/", Component: Dashbaord },
+ { path: "/investment-opportunities", Component: InvestmentOpportunities },
{ path: "/sponser", Component: Sponser },
{ path: "/sponser/add-sponser/:id", Component: AddSponser },
{ path: "/sponser/add-sponser", Component: AddSponser },
From 874940ae7c28420a7fbae4864674bb96057066e2 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Mon, 13 Jan 2025 19:24:03 +0530
Subject: [PATCH 05/50] =?UTF-8?q?Spelling=20=E2=9C=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Layout/DefaultLayout.jsx | 2 +-
src/Pages/Master/Sponser/AddSponser.jsx | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Layout/DefaultLayout.jsx b/src/Layout/DefaultLayout.jsx
index f615b1e..d2ab662 100644
--- a/src/Layout/DefaultLayout.jsx
+++ b/src/Layout/DefaultLayout.jsx
@@ -218,7 +218,7 @@ const DashboardLayout = ({ isOnline }) => {
return (
- Deposite Request
+ Deposit Request
);
diff --git a/src/Pages/Master/Sponser/AddSponser.jsx b/src/Pages/Master/Sponser/AddSponser.jsx
index ed3b276..2a86177 100644
--- a/src/Pages/Master/Sponser/AddSponser.jsx
+++ b/src/Pages/Master/Sponser/AddSponser.jsx
@@ -254,7 +254,7 @@ const AddSponser = () => {
} characters.`,
},
{
- label: "Email adress",
+ label: "Email address",
name: "email",
placeHolder: " ",
type: "email",
From 5928af4283c396065138c3b4c574306d0a7e7d3e Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Wed, 15 Jan 2025 17:06:00 +0530
Subject: [PATCH 06/50] =?UTF-8?q?[update]=20-=20dashboard=20=E2=9D=A4?=
=?UTF-8?q?=EF=B8=8F=E2=9C=85=F0=9F=98=92?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Components/DataTable/NormalTable.jsx | 1 -
src/Layout/DefaultLayout.jsx | 8 +
src/Pages/Dashboard/Dashbaord.jsx | 542 +++++++++++++-----
.../Dashboard/InvestmentOpportunities.jsx | 269 ++++-----
src/Routes/Nav.js | 2 +-
src/Services/dashboard.service.js | 20 +
src/Store/Store.js | 3 +
7 files changed, 566 insertions(+), 279 deletions(-)
create mode 100644 src/Services/dashboard.service.js
diff --git a/src/Components/DataTable/NormalTable.jsx b/src/Components/DataTable/NormalTable.jsx
index af3155f..a08a134 100644
--- a/src/Components/DataTable/NormalTable.jsx
+++ b/src/Components/DataTable/NormalTable.jsx
@@ -58,7 +58,6 @@ const NormalTable = ({
};
-
const handleCheckboxChange = (value) => {
if (radio) {
// If radio is true, select only one option
diff --git a/src/Layout/DefaultLayout.jsx b/src/Layout/DefaultLayout.jsx
index d74a08b..39f6a95 100644
--- a/src/Layout/DefaultLayout.jsx
+++ b/src/Layout/DefaultLayout.jsx
@@ -140,6 +140,14 @@ const DashboardLayout = ({ isOnline }) => {
switch (true) {
case "/":
return "👋🏻 Hi, Admin";
+
+ case path.startsWith("/"):
+ return (
+
+ Dashboard
+
+ );
+
case path.startsWith("/investment-opportunities"):
return (
diff --git a/src/Pages/Dashboard/Dashbaord.jsx b/src/Pages/Dashboard/Dashbaord.jsx
index 833ff84..bd56825 100644
--- a/src/Pages/Dashboard/Dashbaord.jsx
+++ b/src/Pages/Dashboard/Dashbaord.jsx
@@ -1,201 +1,455 @@
-import { Box, Divider, Flex, Grid, GridItem, Heading, HStack, Select, SimpleGrid, Stack, Text } from '@chakra-ui/react'
-import React from 'react'
-import { BsArrowsAngleContract, BsBoxArrowDown, BsBoxArrowUp } from "react-icons/bs";
+import {
+ Box,
+ Divider,
+ Flex,
+ Heading,
+ HStack,
+ Select,
+ SimpleGrid,
+ Text,
+} from "@chakra-ui/react";
+import React, { useState } from "react";
+import {
+ BsArrowsAngleContract,
+ BsBoxArrowDown,
+ BsBoxArrowUp,
+} from "react-icons/bs";
+import { FaRegPenToSquare } from "react-icons/fa6";
import { LuContact } from "react-icons/lu";
-import { FaRegPenToSquare } from "react-icons/fa6";
-import InvestmentOpportunities from './InvestmentOpportunities';
-import { Link } from 'react-router-dom';
+import { Link } from "react-router-dom";
+import { useGetDashboardMasterQuery } from "../../Services/dashboard.service";
+import InvestmentOpportunities from "./InvestmentOpportunities";
-const panddingReguest = [
- {
- icon: ,
- label: "Pending deposit requests",
- count: 27,
- },
- {
- icon: ,
- label: "Pending withdrawal requests",
- count: 27,
- },
- {
- icon: ,
- label: "Pending KYC review request",
- count: 27,
- },
- {
- icon: ,
- label: "Pending Acc modification request",
- count: 27,
- },
-];
-
-const userActivity = [
- {
- icon: ,
- label: "Total number of users",
- count: 1500,
- },
- {
- icon: ,
- label: "Total number of users with completed KYC (%)",
- count: '320',
- percentage:'(50%)',
- },
- {
- icon: ,
- label: "Total number of Active users",
- count: '3,298',
- },
-];
-
-const closedOpportunities = [
- {
- icon: ,
- label: "Closed Opportunities",
- count: 27,
- },
- {
- icon: ,
- label: "Total assets under managemnet",
- count: 27,
- },
- {
- icon: ,
- label: "Total number of investors",
- count: 27,
- },
- {
- icon: ,
- label: "Total number of unique investors",
- count: 27,
- },
-];
-
-const walletCase = [
- { amount: "$ د. ب. 50,000", currency: "USD" },
- { amount: "$ د. ب. 50,000", currency: "BHD" },
- { amount: "$ ﷼. 50,000", currency: "SAR" },
- { amount: "$ د.ك 50,0000", currency: "KWD" },
- { amount: "$ د.إ 50,000", currency: "AED" },
- { amount: "$ ﷼ 50,000", currency: "OMR" },
- { amount: "$ ر. ق 50,000" , currency: "QAR" },
-];
+// const panddingReguest = [
+// {
+// icon: ,
+// label: "Pending deposit requests",
+// count: 27,
+// },
+// {
+// icon: ,
+// label: "Pending withdrawal requests",
+// count: 27,
+// },
+// {
+// icon: ,
+// label: "Pending KYC review request",
+// count: 27,
+// },
+// {
+// icon: ,
+// label: "Pending Acc modification request",
+// count: 27,
+// },
+// ];
const Dashbaord = ({ showSearch = false }) => {
+ const [filter, setFilter] = useState("today");
+ const { data, error, isLoading } = useGetDashboardMasterQuery();
+ console.log(data);
+
+ const panddingReguest = [
+ {
+ icon: ,
+ label: "Pending deposit requests",
+ count: parseFloat(
+ data?.data?.pendingRequests?.pendingDepositReq?.totalDepositReq || 0
+ ).toLocaleString(),
+ },
+ {
+ icon: ,
+ label: "Pending withdrawal requests",
+ count: parseFloat(
+ data?.data?.pendingRequests?.pendingWithdrawalReq || 0
+ ).toLocaleString(),
+ },
+ {
+ icon: ,
+ label: "Pending KYC review request",
+ count: parseFloat(
+ data?.data?.pendingRequests?.pendingKYCReviewReq || 0
+ ).toLocaleString(),
+ },
+ {
+ icon: ,
+ label: "Pending Acc modification request",
+ count: parseFloat(
+ data?.data?.pendingRequests?.pendingAccModReq?.totalAccModReq || 0
+ ).toLocaleString(),
+ },
+ ];
+
+ const userActivity = [
+ {
+ icon: ,
+ label: "Total number of users",
+ count: data?.data?.userActivity?.totalCount, //totalCount
+ },
+ {
+ icon: ,
+ label: "Total number of users with completed KYC (%)",
+ count: data?.data?.userActivity?.KYCCompletedCount, //KYCCompletedCount
+ percentage: data?.data?.userActivity?.completedKYCPer, //completedKYCPer
+ },
+ {
+ icon: ,
+ label: "Total number of Active users",
+ count: data?.data?.userActivity?.ActiveUsers, //ActiveUsers
+ },
+ ];
+
+ const closedOpportunities = [
+ {
+ icon: ,
+ label: "Closed Opportunities",
+ count: parseFloat(
+ data?.data?.investmentOpportunity?.closedOpportunityDetails
+ ?.numberOfClosedOpportunities || 0
+ ).toLocaleString(),
+ },
+ {
+ icon: ,
+ label: "Total assets under managemnet",
+ count: `$ ${parseFloat(
+ data?.data?.investmentOpportunity?.closedOpportunityDetails?.totalAUM ||
+ 0
+ ).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}`,
+ },
+ {
+ icon: ,
+ label: "Total number of investors",
+ count: parseFloat(
+ data?.data?.investmentOpportunity?.closedOpportunityDetails
+ ?.totalNumberOfInvestors || 0
+ ).toLocaleString(),
+ },
+ {
+ icon: ,
+ label: "Total number of unique investors",
+ count: parseFloat(
+ data?.data?.investmentOpportunity?.closedOpportunityDetails
+ ?.numberOfUniqueInvestors || 0
+ ).toLocaleString(),
+ },
+ ];
+
+ const walletCase = [
+ {
+ amount: `$ ${parseFloat(
+ data?.data?.walletBalance?.usersWalletCashInUSD || 0
+ ).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}`,
+ currency: "USD",
+ },
+ {
+ amount: ` د. ب. ${parseFloat(
+ data?.data?.walletBalance?.usersWalletCashInBHD || 0
+ ).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}`,
+ currency: "BHD",
+ },
+ {
+ amount: ` ﷼. ${parseFloat(
+ data?.data?.walletBalance?.usersWalletCashInSAR || 0
+ ).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}`,
+ currency: "SAR",
+ },
+ {
+ amount: ` د.ك ${parseFloat(
+ data?.data?.walletBalance?.usersWalletCashInKWD || 0
+ ).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}`,
+ currency: "KWD",
+ },
+ {
+ amount: ` د.إ ${parseFloat(
+ data?.data?.walletBalance?.usersWalletCashInAED || 0
+ ).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}`,
+ currency: "AED",
+ },
+ {
+ amount: ` ﷼. ${parseFloat(
+ data?.data?.walletBalance?.usersWalletCashInOMR || 0
+ ).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}`,
+ currency: "OMR",
+ },
+ {
+ amount: ` ر. ق. ${parseFloat(
+ data?.data?.walletBalance?.usersWalletCashInQAR || 0
+ ).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}`,
+ currency: "QAR",
+ },
+ ];
+
return (
-
-
-
- Pending Request
+
+
+
+
+ Pending Request
+
{panddingReguest.map((item, index) => (
- {item.icon}
-
+
+ {item.icon}
+
+
{item.label}
-
+
{item.count}
))}
-
- User Activity
+
+
+ User Activity
+
{userActivity.map((item, index) => (
-
- {item.icon}
-
- {item.label}
-
+
+ {item.icon}
+
+ {item.label}
+
-
- {item.count} {item.percentage}
+
+ {item?.count}
+ {item?.percentage && (
+
+ {` (${item?.percentage}) %`}
+
+ )}
))}
-
-
-
-
-
- 80%
- Users that opened the app today
+
+
+
+
+
+
+ {data?.data?.userActivity?.openedAppToday?.percentage} %
+
+
+ Users that opened the app today
+
-
-
- 3,298
- New sign-ups
+
+
+
+ {parseFloat(
+ data?.data?.userActivity?.loggedInWithInLastMonth
+ ?.number || 0
+ ).toLocaleString()}
+
+
+ Users who logged in during the last month
+
-
-
-
-
-
- Investment Opportunities
+
+
+
+ Investment Opportunities
+
-
-
- Open Opportunities
-
+
+
+
+ Open Opportunities
+
+
+
+
-
-
+
+
{closedOpportunities.map((item, index) => (
-
- {item.icon}
-
+
+
+ {item.icon}
+
+
{item.label}
-
+
+ {/* {parseFloat(item?.count || 0).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })} */}
{item.count}
))}
-
- Wallet Balances
+
+
+ Wallet Balances
+
-
- $ 50,000
- TOTAL CASH AVAILABLE ACROSS ALL WALLETS USD
+
+
+ ${" "}
+ {parseFloat(
+ data?.data?.walletBalance?.totalCashAvailAcrossAllUSD || 0
+ ).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}
+ {/* {data?.data?.walletBalance?.totalCashAvailAcrossAllUSD} */}
+
+
+ TOTAL CASH AVAILABLE ACROSS ALL WALLETS USD
+
- Sum of users available wallet cash in
-
+
+ Sum of users available wallet cash in
+
+
{walletCase.slice(0, 4).map((item, index) => (
@@ -223,7 +477,7 @@ const Dashbaord = ({ showSearch = false }) => {
- )
-}
+ );
+};
-export default Dashbaord
+export default Dashbaord;
diff --git a/src/Pages/Dashboard/InvestmentOpportunities.jsx b/src/Pages/Dashboard/InvestmentOpportunities.jsx
index 260334a..1d8ed47 100644
--- a/src/Pages/Dashboard/InvestmentOpportunities.jsx
+++ b/src/Pages/Dashboard/InvestmentOpportunities.jsx
@@ -1,122 +1,102 @@
-import {
- Box,
- HStack,
- Input,
- Select,
- Text,
- useToast,
- } from "@chakra-ui/react";
- import React, { useContext, useEffect, useState, useRef } from "react";
+import { Box, HStack, Input, Select, Text, useToast } from "@chakra-ui/react";
+import React, { useContext, useEffect, useState } from "react";
import { OPACITY_ON_LOAD } from "../../Layout/animations";
import GlobalStateContext from "../../Contexts/GlobalStateContext";
import CustomAlertDialog from "../../Components/CustomAlertDialog";
import NormalTable from "../../Components/DataTable/NormalTable";
-
- const formatDate = (date) => new Date(date).toLocaleDateString();
-
- const InvestmentOpportunities = ({ showSearch = true }) => {
- const toast = useToast();
- const { opportunities, setOpportunities, slideFromRight } =
- useContext(GlobalStateContext);
- const [searchTerm, setSearchTerm] = useState("");
- const [isLoading, setIsLoading] = useState(true);
- const [deleteAlert, setDeleteAlert] = useState(false);
- const [actionId, setActionId] = useState(false);
-
- // const {
- // data: bankDetails,
- // isLoading: bankDetailsLoading,
- // error,
- // } = useGetBankQuery({ page: 1, size: 10 });
-
- useEffect(() => {
- // Simulate loading
- const timer = setTimeout(() => {
- setIsLoading(false);
- }, 1500);
-
- // Cleanup the timer on component unmount
- return () => clearTimeout(timer);
- }, []);
-
- // ====================================================[Table Setup]================================================================
- const tableHeadRow = [
- "Sr N/O",
- "Investors",
- "Amount remaining %",
- "Total deal size",
- //
- // Total deal size
- //
- //
- //
- //
- //
- // ,
- "No of views",
- ];
-
- // ====================================================[Table Filter]================================================================
- const filteredData = opportunities?.filter((item) => {
- // Filter by name (case insensitive)
- const name = item.Investors;
- const searchLower = searchTerm.toLowerCase();
- const nameMatches = name?.toLowerCase().includes(searchLower);
-
- return nameMatches;
- });
-
-
- const extractedArray = filteredData?.map((item,index) => ({
- id: item?.id,
- "Sr N/O": (
-
- {item.id}
+import { useGetDashboardMasterQuery } from "../../Services/dashboard.service";
+import { generateSerialNumber } from "../../Constants/Constants";
+
+const formatDate = (date) => new Date(date).toLocaleDateString();
+
+const InvestmentOpportunities = ({ showSearch = true, selectStyle = {} }) => {
+ const toast = useToast();
+ const { opportunities, setOpportunities, slideFromRight } =
+ useContext(GlobalStateContext);
+ const [searchTerm, setSearchTerm] = useState("");
+ const [isLoading, setIsLoading] = useState(true);
+ const [deleteAlert, setDeleteAlert] = useState(false);
+ const [actionId, setActionId] = useState(null);
+ const [filter, setFilter] = useState(null);
+
+ const { data, error } = useGetDashboardMasterQuery();
+
+ useEffect(() => {
+ const timer = setTimeout(() => setIsLoading(false), 1500);
+ return () => clearTimeout(timer);
+ }, []);
+
+ const tableHeadRow = [
+ "Sr No",
+ "Investors",
+ "Amount Remaining %",
+ "Total Deal Size",
+ "No of Views",
+ ];
+
+ const filteredData =
+ data?.data?.investmentOpportunity?.openOpportunityDetails?.filter((item) =>
+ item?.Investment_name?.toLowerCase().includes(searchTerm.toLowerCase())
+ );
+
+ const extractedArray = filteredData?.map((item, index) => ({
+ id: item?.id,
+ "Sr No": (
+
+ {index + 1}
+
+ ),
+ Investors: (
+
+
+ {item?.Investment_name}
- ),
- "Investors": (
-
-
- {item?.Investors}
-
-
- ),
- "Amount remaining %": (
-
-
- {item?.amountRemaining}
-
-
- ),
- "Total deal size": (
-
-
- {item?.totalDealsize}
-
-
- ),
- "No of views": (
-
-
- {item.noViews}
-
-
- ),
- }));
-
- return (
-
-
+
+ ),
+ "Amount Remaining %": (
+
+
+ {`${parseFloat(item?.Amount_remaining_per || 0).toLocaleString()} %`}
+
+
+ ),
+ "Total Deal Size": (
+
+
+ {`$ ${parseFloat(item?.Deal_size || 0).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}`}
+
+
+ ),
+ "No of Views": (
+
+
+ {item?.Views_today}
+ {filter === "today"
+ ? item?.Views_today
+ : filter === "last7days"
+ ? item?.Views_last_7_days
+ : item?.Views_mtd}
+
+
+ ),
+ }));
+
+ return (
+
+
{showSearch && (
)}
+
+ setFilter(e.target.value)}
+ >
+
+
+
+
-
-
-
- setDeleteAlert(false)}
- isOpen={deleteAlert}
- message={"Are you sure you want to delete sponers?"}
- isLoading={isLoading}
- />
- );
- };
-
- export default InvestmentOpportunities;
-
\ No newline at end of file
+
+
+
+ setDeleteAlert(false)}
+ isOpen={deleteAlert}
+ message={"Are you sure you want to delete this opportunity?"}
+ isLoading={isLoading}
+ />
+
+ );
+};
+
+export default InvestmentOpportunities;
diff --git a/src/Routes/Nav.js b/src/Routes/Nav.js
index d01b988..b7b5f1a 100644
--- a/src/Routes/Nav.js
+++ b/src/Routes/Nav.js
@@ -37,7 +37,7 @@ export const nav = [
{
title: "Dashboard",
type: "single",
- path: "/dashboard",
+ path: "/",
Icon: TbLayoutDashboard,
},
{
diff --git a/src/Services/dashboard.service.js b/src/Services/dashboard.service.js
new file mode 100644
index 0000000..fa1c88f
--- /dev/null
+++ b/src/Services/dashboard.service.js
@@ -0,0 +1,20 @@
+// 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 dashboardMaster = createApi({
+ reducerPath: "Dashboard",
+ baseQuery: baseQuery,
+ tagTypes: ["getDashboard"],
+ endpoints: (builder) => ({
+ // ======[Get All]=====
+
+ getDashboardMaster: builder.query({
+ query: () => `/dashboard/admin/`,
+ providesTags: ["getDashboard"],
+ }),
+ }),
+});
+
+export const { useGetDashboardMasterQuery } = dashboardMaster;
diff --git a/src/Store/Store.js b/src/Store/Store.js
index 8d1bc65..f3a101c 100644
--- a/src/Store/Store.js
+++ b/src/Store/Store.js
@@ -20,6 +20,7 @@ import { fawateerMaker } from "../Services/fawateer.maker.service";
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";
export const store = configureStore({
reducer: {
@@ -41,6 +42,7 @@ export const store = configureStore({
[sabAdminMaster.reducerPath]: sabAdminMaster.reducer,
[changePasswordMake.reducerPath]: changePasswordMake.reducer,
[forgetPasswordMake.reducerPath]: forgetPasswordMake.reducer,
+ [dashboardMaster.reducerPath]: dashboardMaster.reducer,
// Add other reducers as needed
},
@@ -68,6 +70,7 @@ export const store = configureStore({
sabAdminMaster.middleware,
changePasswordMake.middleware,
forgetPasswordMake.middleware,
+ dashboardMaster.middleware,
),
});
From 4e4de8caf577524505d41be3dfb57ea4ebe3df54 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Wed, 15 Jan 2025 17:29:17 +0530
Subject: [PATCH 07/50] [update] - format percentage display and adjust
navigation path
---
.../Dashboard/InvestmentOpportunities.jsx | 19 ++++++++++++-------
src/Pages/Login.jsx | 2 +-
2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/src/Pages/Dashboard/InvestmentOpportunities.jsx b/src/Pages/Dashboard/InvestmentOpportunities.jsx
index 1d8ed47..d11a454 100644
--- a/src/Pages/Dashboard/InvestmentOpportunities.jsx
+++ b/src/Pages/Dashboard/InvestmentOpportunities.jsx
@@ -62,7 +62,13 @@ const InvestmentOpportunities = ({ showSearch = true, selectStyle = {} }) => {
"Amount Remaining %": (
- {`${parseFloat(item?.Amount_remaining_per || 0).toLocaleString()} %`}
+ {`${parseFloat(item?.Amount_remaining_per || 0).toLocaleString(
+ undefined,
+ {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ }
+ )} %`}
),
@@ -79,12 +85,11 @@ const InvestmentOpportunities = ({ showSearch = true, selectStyle = {} }) => {
"No of Views": (
- {item?.Views_today}
- {filter === "today"
- ? item?.Views_today
+ {filter === "last30days"
+ ? item?.Views_mtd
: filter === "last7days"
? item?.Views_last_7_days
- : item?.Views_mtd}
+ : item?.Views_today}
),
@@ -136,8 +141,8 @@ const InvestmentOpportunities = ({ showSearch = true, selectStyle = {} }) => {
-
-
+
+
diff --git a/src/Pages/Login.jsx b/src/Pages/Login.jsx
index 62837f1..d53844c 100644
--- a/src/Pages/Login.jsx
+++ b/src/Pages/Login.jsx
@@ -78,7 +78,7 @@ const Login = () => {
setIsLoading(false);
setIsAuthenticate(true);
Cookies.set("isAuthenticated", true, { expires: 7 });
- navigate("/sponser");
+ navigate("/");
reset();
}
From 3d456c3c48070acfa9ceb59d02c46578eba320b2 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Wed, 15 Jan 2025 17:55:59 +0530
Subject: [PATCH 08/50] [update] - refactor Notification component for improved
readability and adjust message validation
---
src/Pages/Admin/Notification.jsx | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/src/Pages/Admin/Notification.jsx b/src/Pages/Admin/Notification.jsx
index 874a28a..1579aa1 100644
--- a/src/Pages/Admin/Notification.jsx
+++ b/src/Pages/Admin/Notification.jsx
@@ -26,7 +26,10 @@ import ToastBox from "../../Components/ToastBox";
import NormalTable from "../../Components/DataTable/NormalTable";
import GlobalStateContext from "../../Contexts/GlobalStateContext";
import { useGetInvestorsQuery } from "../../Services/investor.details.service";
-import { INVESTOR_TABLE_PAGINATION, TABLE_PAGINATION } from "../../Constants/Paginations";
+import {
+ INVESTOR_TABLE_PAGINATION,
+ TABLE_PAGINATION,
+} from "../../Constants/Paginations";
import { formatDate, generateSerialNumber } from "../../Constants/Constants";
import { ViewIcon } from "@chakra-ui/icons";
import { useGetUnbanInvestorQuery } from "../../Services/ban.investor.service";
@@ -49,7 +52,7 @@ export const notification = yup.object().shape({
export const notificationNew = yup.object().shape({
title: yup.string().required("Notification Header is required"),
- message: yup.string().required("Message is required"),
+ message: yup.string().notRequired(),
});
const Notification = () => {
@@ -59,7 +62,9 @@ const Notification = () => {
const [isLoading, setIsLoading] = useState(false);
const [selectedRadio, setSelectedRadio] = useState([]);
const [pageSize, setPageSize] = useState(INVESTOR_TABLE_PAGINATION?.size);
- const [currentPage, setCurrentPage] = useState(INVESTOR_TABLE_PAGINATION?.page);
+ const [currentPage, setCurrentPage] = useState(
+ INVESTOR_TABLE_PAGINATION?.page
+ );
const [searchTerm, setSearchTerm] = useState("");
const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
const [country, setCountry] = useState("");
@@ -108,16 +113,18 @@ const Notification = () => {
}, 300);
return () => clearTimeout(handler);
}, [searchTerm]);
-
- const { data: investorDetails, isLoading: investorDetailsLoading, refetch } =
- useGetUnbanInvestorQuery(
+ const {
+ data: investorDetails,
+ isLoading: investorDetailsLoading,
+ refetch,
+ } = useGetUnbanInvestorQuery(
{
page: 1, // Omit pagination for search
size: 10000, // Omit pagination for search
// page: debouncedSearchTerm ? undefined : currentPage, // Disable pagination for search
// size: debouncedSearchTerm ? undefined : 10000 || pageSize || 500, // Disable pagination for search
- search: debouncedSearchTerm, // Pass search term
+ search: debouncedSearchTerm, // Pass search term
country_xid: country,
KYCStatus: kyc,
},
@@ -131,10 +138,6 @@ const Notification = () => {
// console.log("Debounced Search Term:", debouncedSearchTerm);
// console.log("Investor Details:", investorDetails);
// }, [searchTerm, debouncedSearchTerm, investorDetails]);
-
-
-
- console.log(investorDetails);
const [sendNotification] = useSendNotificationMutation();
@@ -190,7 +193,6 @@ const Notification = () => {
setIsLoading(true);
try {
const res = await sendNotification(dataToPass);
- console.log(res);
if (res?.error) {
toast({
@@ -313,7 +315,6 @@ const Notification = () => {
),
}));
-
return (
From 20213408c47cf8d91b12c21636e1a72585fc50ce Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Wed, 15 Jan 2025 18:00:54 +0530
Subject: [PATCH 09/50] [update] - enforce message requirement for specific
status in UpdateIOStatus component
---
src/Pages/IO_Management/ViewIO/HeaderModal/UpdateIOStatus.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Pages/IO_Management/ViewIO/HeaderModal/UpdateIOStatus.jsx b/src/Pages/IO_Management/ViewIO/HeaderModal/UpdateIOStatus.jsx
index 1db3014..8b36298 100644
--- a/src/Pages/IO_Management/ViewIO/HeaderModal/UpdateIOStatus.jsx
+++ b/src/Pages/IO_Management/ViewIO/HeaderModal/UpdateIOStatus.jsx
@@ -57,7 +57,7 @@ const UpdateIOStatus = ({ isOpen, onClose, status }) => {
setError("Please select status");
return;
}
- if (!message) {
+ if (selectedStatusId == 6 && !message) {
return setMessageError("message is required");
}
setError("");
From d23bf5d7e9d1362e6eab99fc750e72eef2b460f3 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Wed, 15 Jan 2025 19:02:43 +0530
Subject: [PATCH 10/50] =?UTF-8?q?[=20Change=20Icon=20=F0=9F=A5=B1]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Images/dash_icon_1.svg | 4 ++
src/Images/dash_icon_2.svg | 4 ++
src/Images/dash_icon_3.svg | 7 +++
src/Images/dash_icon_4.svg | 3 ++
src/Images/dash_icon_5.svg | 3 ++
src/Images/dash_icon_6.svg | 5 ++
src/Images/dash_icon_7.svg | 3 ++
src/Pages/Dashboard/Dashbaord.jsx | 54 +++++++++++--------
.../Dashboard/InvestmentOpportunities.jsx | 2 +-
9 files changed, 62 insertions(+), 23 deletions(-)
create mode 100644 src/Images/dash_icon_1.svg
create mode 100644 src/Images/dash_icon_2.svg
create mode 100644 src/Images/dash_icon_3.svg
create mode 100644 src/Images/dash_icon_4.svg
create mode 100644 src/Images/dash_icon_5.svg
create mode 100644 src/Images/dash_icon_6.svg
create mode 100644 src/Images/dash_icon_7.svg
diff --git a/src/Images/dash_icon_1.svg b/src/Images/dash_icon_1.svg
new file mode 100644
index 0000000..d6ddeb7
--- /dev/null
+++ b/src/Images/dash_icon_1.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/Images/dash_icon_2.svg b/src/Images/dash_icon_2.svg
new file mode 100644
index 0000000..02736d2
--- /dev/null
+++ b/src/Images/dash_icon_2.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/Images/dash_icon_3.svg b/src/Images/dash_icon_3.svg
new file mode 100644
index 0000000..1592b46
--- /dev/null
+++ b/src/Images/dash_icon_3.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/Images/dash_icon_4.svg b/src/Images/dash_icon_4.svg
new file mode 100644
index 0000000..9a1efb8
--- /dev/null
+++ b/src/Images/dash_icon_4.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/Images/dash_icon_5.svg b/src/Images/dash_icon_5.svg
new file mode 100644
index 0000000..d548db0
--- /dev/null
+++ b/src/Images/dash_icon_5.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/Images/dash_icon_6.svg b/src/Images/dash_icon_6.svg
new file mode 100644
index 0000000..81207ec
--- /dev/null
+++ b/src/Images/dash_icon_6.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/Images/dash_icon_7.svg b/src/Images/dash_icon_7.svg
new file mode 100644
index 0000000..6c9d94b
--- /dev/null
+++ b/src/Images/dash_icon_7.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/Pages/Dashboard/Dashbaord.jsx b/src/Pages/Dashboard/Dashbaord.jsx
index bd56825..55514e6 100644
--- a/src/Pages/Dashboard/Dashbaord.jsx
+++ b/src/Pages/Dashboard/Dashbaord.jsx
@@ -4,6 +4,7 @@ import {
Flex,
Heading,
HStack,
+ Image,
Select,
SimpleGrid,
Text,
@@ -19,6 +20,13 @@ import { LuContact } from "react-icons/lu";
import { Link } from "react-router-dom";
import { useGetDashboardMasterQuery } from "../../Services/dashboard.service";
import InvestmentOpportunities from "./InvestmentOpportunities";
+import IconOne from '../../Images/dash_icon_1.svg';
+import IconTwo from '../../Images/dash_icon_2.svg';
+import IconThree from '../../Images/dash_icon_3.svg';
+import IconFour from '../../Images/dash_icon_4.svg'
+import IconFive from '../../Images/dash_icon_5.svg';
+import IconSix from '../../Images/dash_icon_6.svg';
+import IconSeven from '../../Images/dash_icon_7.svg'
// const panddingReguest = [
// {
@@ -50,28 +58,28 @@ const Dashbaord = ({ showSearch = false }) => {
const panddingReguest = [
{
- icon: ,
+ icon: IconOne,
label: "Pending deposit requests",
count: parseFloat(
data?.data?.pendingRequests?.pendingDepositReq?.totalDepositReq || 0
).toLocaleString(),
},
{
- icon: ,
+ icon: IconTwo,
label: "Pending withdrawal requests",
count: parseFloat(
data?.data?.pendingRequests?.pendingWithdrawalReq || 0
).toLocaleString(),
},
{
- icon: ,
+ icon: IconThree,
label: "Pending KYC review request",
count: parseFloat(
data?.data?.pendingRequests?.pendingKYCReviewReq || 0
).toLocaleString(),
},
{
- icon: ,
+ icon: IconFour,
label: "Pending Acc modification request",
count: parseFloat(
data?.data?.pendingRequests?.pendingAccModReq?.totalAccModReq || 0
@@ -81,18 +89,18 @@ const Dashbaord = ({ showSearch = false }) => {
const userActivity = [
{
- icon: ,
+ icon: IconFive,
label: "Total number of users",
count: data?.data?.userActivity?.totalCount, //totalCount
},
{
- icon: ,
+ icon: IconSix,
label: "Total number of users with completed KYC (%)",
count: data?.data?.userActivity?.KYCCompletedCount, //KYCCompletedCount
percentage: data?.data?.userActivity?.completedKYCPer, //completedKYCPer
},
{
- icon: ,
+ icon: IconSeven,
label: "Total number of Active users",
count: data?.data?.userActivity?.ActiveUsers, //ActiveUsers
},
@@ -100,7 +108,7 @@ const Dashbaord = ({ showSearch = false }) => {
const closedOpportunities = [
{
- icon: ,
+ icon: IconOne,
label: "Closed Opportunities",
count: parseFloat(
data?.data?.investmentOpportunity?.closedOpportunityDetails
@@ -108,7 +116,7 @@ const Dashbaord = ({ showSearch = false }) => {
).toLocaleString(),
},
{
- icon: ,
+ icon: IconOne,
label: "Total assets under managemnet",
count: `$ ${parseFloat(
data?.data?.investmentOpportunity?.closedOpportunityDetails?.totalAUM ||
@@ -119,7 +127,7 @@ const Dashbaord = ({ showSearch = false }) => {
})}`,
},
{
- icon: ,
+ icon: IconOne,
label: "Total number of investors",
count: parseFloat(
data?.data?.investmentOpportunity?.closedOpportunityDetails
@@ -127,7 +135,7 @@ const Dashbaord = ({ showSearch = false }) => {
).toLocaleString(),
},
{
- icon: ,
+ icon: IconOne,
label: "Total number of unique investors",
count: parseFloat(
data?.data?.investmentOpportunity?.closedOpportunityDetails
@@ -220,9 +228,9 @@ const Dashbaord = ({ showSearch = false }) => {
{panddingReguest.map((item, index) => (
-
+
- {item.icon}
+
{item.label}
@@ -241,9 +249,9 @@ const Dashbaord = ({ showSearch = false }) => {
{userActivity.map((item, index) => (
-
+
- {item.icon}
+
{
))}
-
+
@@ -313,6 +321,7 @@ const Dashbaord = ({ showSearch = false }) => {
p={4}
rounded={10}
alignItems={"inherit"}
+ border={'1px solid #0047171f'}
>
{
Investment Opportunities
-
+
{
selectStyle={{
right: "5px",
marginBottom: "5px",
+ bg:'#e6f3e9'
}}
/>
{closedOpportunities.map((item, index) => (
-
+
- {item.icon}
+
{item.label}
@@ -431,7 +441,7 @@ const Dashbaord = ({ showSearch = false }) => {
Wallet Balances
-
+
${" "}
{parseFloat(
@@ -451,7 +461,7 @@ const Dashbaord = ({ showSearch = false }) => {
{walletCase.slice(0, 4).map((item, index) => (
-
+
{item.amount}
@@ -464,7 +474,7 @@ const Dashbaord = ({ showSearch = false }) => {
{walletCase.slice(4).map((item, index) => (
-
+
{item.amount}
diff --git a/src/Pages/Dashboard/InvestmentOpportunities.jsx b/src/Pages/Dashboard/InvestmentOpportunities.jsx
index 1d8ed47..8ceea56 100644
--- a/src/Pages/Dashboard/InvestmentOpportunities.jsx
+++ b/src/Pages/Dashboard/InvestmentOpportunities.jsx
@@ -60,7 +60,7 @@ const InvestmentOpportunities = ({ showSearch = true, selectStyle = {} }) => {
),
"Amount Remaining %": (
-
+
{`${parseFloat(item?.Amount_remaining_per || 0).toLocaleString()} %`}
From 1beeeed8d3065d2a9c577d25bb528b5cdbc770e6 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Wed, 15 Jan 2025 19:53:02 +0530
Subject: [PATCH 11/50] =?UTF-8?q?[=20Dashboard=20design=20changes=20done?=
=?UTF-8?q?=20=F0=9F=98=8E=F0=9F=98=B7=20]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Images/dash_icon_3n.png | Bin 0 -> 2167 bytes
src/Images/dash_icon_6n.png | Bin 0 -> 3555 bytes
src/Pages/Dashboard/Dashbaord.jsx | 58 ++++++++++--------
.../Dashboard/InvestmentOpportunities.jsx | 12 ++--
4 files changed, 39 insertions(+), 31 deletions(-)
create mode 100644 src/Images/dash_icon_3n.png
create mode 100644 src/Images/dash_icon_6n.png
diff --git a/src/Images/dash_icon_3n.png b/src/Images/dash_icon_3n.png
new file mode 100644
index 0000000000000000000000000000000000000000..07686be9aff2c3d2087bcfe52151102c2dcf9822
GIT binary patch
literal 2167
zcmV--2#EKIP)@~0drDELIAGL9O(c600d`2O+f$vv5yP-^wI0v>nVLB%L0rly=IcGvU@7;sD8T!TAetZoLssJrZucCHw_-{sNLqhlH8p
zp4uDX)P4*Ja47)h3u{c5#OZ{K?Y$jHbT9?^5D
zS13R}Uuav_XcQoqE5M*M8ddyWRlCijJs-HUIO|5NaUmJ}w*S>?Rj5>}?E>BWVjddD
zKjWu)u){iRzq$*YSeRMI_uKdy{Nx-RKiBr(ug?9B@0Y*10L;FU`%K#(l0cM6N|GYZ15K-%9E2h
zlsHq#!;OniHSumN7$1QaW>&CK
zp8}0DNg>2M1i@3zy=goITAW?Q_ccf(%0`Gn*qhXEup^#8!m&3#QNu}j57LHygL)}5
z;+fe&!;V0ql@?nZI>ueJ>d>4P&EuuZn7S;+>3wVXo4Z!5yj;%5zqM;I-}@jMyp=J~
z4<9I|yI$X*VDreWu1}ZnHiE=NRXv~0u?dS0Ipl^dd-Y8I)jWfACC*o!9qch_u4R{Epd!#2YY)>OGqE
z*ubO2>BSK#Xxss__`Mdk3nb-6&o3JHV^Nf46lfAt1CNT@hbHzKdoU%knL=H`y4ty2
zpqdrn1n1h-Pn_4?6weeiL6Gfqbx(SiEKhFg(skDe|oJ5;KsrX
z-H`UaACYnsPogC-_IqfA3^UFp2uCZI3#HV+|sPI9tp%S4PR_&))f&%Af+4;U|!qEQ`Lh#G50Ehu$fR
zKFEL4Nf;ggo>rWc>zcJ*BJl&^K6FzW36~uhk{od4yXj|W5c~kqMT|W7<}(3*{a1lu
zh!f`^oF&}9bt8eNKz~+iaOso0D((=;;3CoV!MEps!cRYHw<9n9_Ny&m06%Z`d#L)>
z!2!j=xqY_uQOH#syP_xXNSMh<54T&3wLh8~X98b=2o=@yB<9xDlX5jJrZL593-_ca
z#`8=IF~@28pSM7Sid9Q4Cfpk~mb2PUDCXpXb4
z9n%cLPoQSNq6api>2=4sYkNH6WoA>}kCYF=Zed%65SQ^-N@&XOp(&sIOm0m02&8Tv
z$r!LzVYeG0=vay)-4u@q4}nZ&Fbt1pOC6VTxH=vTQp8<|`#2`8fHm>Pb7jWKbl!_T1OPH_I8`0Ou85tWr$c;8=|Rfa5UBT^J6+Qm
zggJGg4+C={WxDGmDA&vFu)*kAKJ~-9i4BCxKa;>CaYJDI1pgs~G7
z_psL%!}iB{sdj7yrEmX~Q56IvPpUOVZC*otkO}$x!=CS?;{V
z^|I}~1hWd<=v5uh6JmvkK6#FgFF+EgkY=}Yapyw@BM#!oh13yzdyuwwpLobe$L+N+
z-a`hRAs%o$FpPT;)jhRDJS$EH*0Y^IR?Jqr(iN^1&OBa+t(~b_WMJ)is%8bE!nILm
zHcc%^xdJTFxGX0od`N;u!|iqQn!QoY=NX&QL-PMYs)eS^3Zx!;S%K361v#ENZ#D&9
zoEo%=W{J=gsL?QEsgZB1e?dL|7@AaUtvqkel%`s3s_dB$yH$Uc(ZC|rkSkfO9_C~MF((sa+)#n8Civs`v002ovPDHLkV1j&e`knv)
literal 0
HcmV?d00001
diff --git a/src/Images/dash_icon_6n.png b/src/Images/dash_icon_6n.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c6af97af6fd8f03991d4e6921076be95272c57d
GIT binary patch
literal 3555
zcmV<94IJ``P)@~0drDELIAGL9O(c600d`2O+f$vv5yP0rm-~J^^Oa(T0dYoB*?*
z2*hGy8axqWB4);5Q_9Jguc}>TXQon8rX<_>MHrh>l`KntzRZ02-b(@7!$YV6FM_7He?8)@
z|2c2@tBQA|{McP?6;g0a2%h>G^oP8)ztso;iTHcobFplJW4tA(6KwsAJ>x&cPz;DT}wKb?G!3cP=Z3u3pb
zW$+@f$^GjwWMe+x57(hc%V*g(9G^T9Q^LRg@L06;La-5JYzJN)>_Z8>2guzT3rl
z{u-1S@MYt5c=fM0bFb0>@->)S1%k1C2*Yju)0-mJ!Hb|MWa@Eh7xSBb2Z}#<g8%pcV{Q~^a102fBUzX$ICt>
z*!#HYMIZwgbjYbw6>ft0IzX0i8dfpPq81&zRtVM}w7a!fTEP<16@9J9bFAdIat}Wc+g1{M03<^Shf8O}RtpVVMxK`R?GSA6KEJ$jf^g=86OQ68UD>pJ0bQV6qMIb-gDTNY{2yhH=6)gaQ
z;ohbLs*{rln!+U9jj<7wU}5s%N1FGbc}yqYFB6AiY53*Alet%ymJZ?Q2ueW@iU!me
zV-SX$R#L{y1h54!KRr<%NB>7C_XsRZrWujq#QSi3e7E)M<~G?)5BZEiek|1Z5C;A2
zi2w);>|kt_-`{G9q&5VAp#Otr5$6cGLL%h{!|>si62K|)znNvaF_X-iQW8noMJZbX
z$RVVddMRlg1rl0{Tm(U=6M^bjIU(2H^f)o_Z0;Nu{r18k!31I@9&5ni?x+2<#S^U@8QFpLM6P;RoQ3B8_l^&+SP=qv{+FX6gW(nq3S4
z!J8R|yHFu`q97?qO(@H^1XJ)j(PLPq>WKJN76c&9liiW#8R30>b+F&O2q+Ew5&w$m
zh2Z@42I2)S4z?!#Kj1fv5zt`BMgWVu(yuEkiSk&6
z=CvTELa=H9#Q7emk7Wsdt6v27ua6*aFjN#AT@U)DLaUVEYNFZ|JcKgj3Bk4i2-UTw
z({%cJMSud($1YT1Xk7@HhAxA;gmQm}N(e3lfa5KtwWY2Asc&FN4iS?ZM|FPK%uS+d
z;P@5gd=`c9!CLh2^71cmbR<6)J~V)G15=va+~n7araHp8x|1RoI{yRKQJN5FDrlzs
zX5IuF(Dd(p&b#ufdr^+PzDAG8CkSs_n?~wN*SIm?cF-5!ntQhObO$sD)G_22bvL&)
zygC?(i>Fp72Tiq|%45^>=^pa1m08Tx=+st#Wm~iVbuR*KzXVkMWAEb*6aibGP6*g?
zi%#QIP=-<>J!V^Qwh$%ml=nP6TW!U?2z28BVNOeye<3rh?)$UM-VB6d1yo^nv6Crk
zS#VbsUHQE;RseA;0y34c;%HjAKV4pa0_u5poV(&@3XU(ZE};rEy|ye*6)=MgGpdwu
z2b-kPxwZtc@`yx{g`v5;{NbRfHd*mAWn~4stW^&cw1G#a2ltgjAu^;3a+#85R^fvL9bF|aTQET<71;!%$QtT0#!)UKG=e+f&6^7
zQ|f>H2mT&i7Z%kn1Tz6_>l$4%YX?{b)b0rt=L;gR4LPE8&Zzo?U?c#MWwoh0jcXA^
z@|S~)ozSxP5pSwa$nJ$;wmV8H5{PneEdoXVY1vFeU}qLkgyrS@sG%%-%RRDdU>iyu
zd<%I3Fx*SgwFpxA%RvNoiKMSu?{;Ruu}I$1Fl~VS+^Qdec2~_SBS3>#L)UpjBCt4z
zCzGp;qy?9l#|S*;7NOb{67Scbk5jK@SiV;LdZaZLwa%k3fpK-`L8X$dbzH3%G5wg%L)R5vEAZ4Uwz!t(NM
z&<_@oNOTVv_h9n3Q|mX4!ZIEMoW-pOXbwM;9>e~!yI3sPXZRRFb=~6u%kx&`gwUvi&@H$Tp!#a50B``H|TN#69=`
z=Jg|S&!wRa_j^4a!{rrxAR46x>ywnMr<#o2coL$9CNfr^i;EZc9c~&NoQVOWX)!5r
z56tREij6M$0MOFFPiGW)B^vg^DSTXE>|4pH7U|3uss~{y20(TJ8=sw!G&RWSh7w>klVi=mqQLAb$
z(Y0)FtMI0vRlsg^OBsTP8OKzaJ#FXg09~Bj?tA0D&JGl0NeeixavaJtA1tdM(c=L3
z>(`r70gw;jH5b%d@wZmU#Bw8oc^7B>i#x<*3TEh-sT(xwIJlE{5eYwbQ_OHwQ@?I^
z3(gLZONP1G?+(nCIO}96_HBrJ?JLST?IP}9fAUAppm`#SJZg%fxe_RVT@e%)0M#83
zU#!3b3L+p2vugJCV3iBubt{E{kQj=E-79MlvBFl*t_U#LG6t-WQ`Lrr2yiE*Eb;}PhTU;X8jtFw&-2==sOrZ`i5cH=XlgTbF
z@`py-#F%vp`0%@3T&q}9RS7p@(8oxm9WI6~Xc^VJgS=eB0%1{s*y!HU{&?Talfz=%GWI)yKKpo#_E7!0pl&h%9AB-Unk%(Gp^=}GZ!>~2?
zWrnJ=1BG9pMQW!#jc{BNpF743JdR{d$hABEb^}Tge1?;gw5?kSl^4NU)PtiVMW1Rh
z;nWVhARoI#U<%D}Qn-Ya?+(6vQ4gx>i1#l-mVK7KZc@7b3eZeea@}+~sq)y$@^^5>
zxf&wyXz?QOI1)h+#?U5oUbxkvBDVx=EsHM4Kc`R9G1ejlLY>DSk50X-O_H%1*F=3-WEY{
zC#54HZ1#8OkDvbjpMChtpUhITJZ)oG
dc&p(V{tu|kH-ux`iw^(*002ovPDHLkV1i$8n|lBN
literal 0
HcmV?d00001
diff --git a/src/Pages/Dashboard/Dashbaord.jsx b/src/Pages/Dashboard/Dashbaord.jsx
index 55514e6..21eb122 100644
--- a/src/Pages/Dashboard/Dashbaord.jsx
+++ b/src/Pages/Dashboard/Dashbaord.jsx
@@ -22,10 +22,10 @@ import { useGetDashboardMasterQuery } from "../../Services/dashboard.service";
import InvestmentOpportunities from "./InvestmentOpportunities";
import IconOne from '../../Images/dash_icon_1.svg';
import IconTwo from '../../Images/dash_icon_2.svg';
-import IconThree from '../../Images/dash_icon_3.svg';
+import IconThree from '../../Images/dash_icon_3n.png';
import IconFour from '../../Images/dash_icon_4.svg'
import IconFive from '../../Images/dash_icon_5.svg';
-import IconSix from '../../Images/dash_icon_6.svg';
+import IconSix from '../../Images/dash_icon_6n.png';
import IconSeven from '../../Images/dash_icon_7.svg'
// const panddingReguest = [
@@ -225,12 +225,12 @@ const Dashbaord = ({ showSearch = false }) => {
Pending Request
-
+
{panddingReguest.map((item, index) => (
-
+
-
+
{item.label}
@@ -246,16 +246,22 @@ const Dashbaord = ({ showSearch = false }) => {
User Activity
-
+
{userActivity.map((item, index) => (
-
+
-
+
+ {item.icon === IconSix ? (
+
+ ) : (
+
+ )}
+
{
))}
-
+
@@ -292,11 +298,11 @@ const Dashbaord = ({ showSearch = false }) => {
>
{data?.data?.userActivity?.openedAppToday?.percentage} %
-
+
Users that opened the app today
-
+
{
?.number || 0
).toLocaleString()}
-
+
Users who logged in during the last month
@@ -318,19 +324,21 @@ const Dashbaord = ({ showSearch = false }) => {
-
+
setFilter(e.target.value)}
>
@@ -355,11 +363,11 @@ const Dashbaord = ({ showSearch = false }) => {
? data?.data?.userActivity?.newSignUps?.last7days
: data?.data?.userActivity?.newSignUps?.last30days}
-
+
New sign-ups{" "}
-
+
{
: data?.data?.userActivity?.newKYCVerifications
?.last30days}
-
+
New KYC verification
@@ -388,7 +396,7 @@ const Dashbaord = ({ showSearch = false }) => {
Investment Opportunities
-
+
{
{closedOpportunities.map((item, index) => (
-
+
-
+
{item.label}
@@ -440,7 +448,7 @@ const Dashbaord = ({ showSearch = false }) => {
Wallet Balances
-
+
${" "}
@@ -461,7 +469,7 @@ const Dashbaord = ({ showSearch = false }) => {
{walletCase.slice(0, 4).map((item, index) => (
-
+
{item.amount}
@@ -474,7 +482,7 @@ const Dashbaord = ({ showSearch = false }) => {
{walletCase.slice(4).map((item, index) => (
-
+
{item.amount}
diff --git a/src/Pages/Dashboard/InvestmentOpportunities.jsx b/src/Pages/Dashboard/InvestmentOpportunities.jsx
index ac71812..f06e633 100644
--- a/src/Pages/Dashboard/InvestmentOpportunities.jsx
+++ b/src/Pages/Dashboard/InvestmentOpportunities.jsx
@@ -1,4 +1,4 @@
-import { Box, HStack, Input, Select, Text, useToast } from "@chakra-ui/react";
+import { Badge, Box, HStack, Input, Select, Text, useToast } from "@chakra-ui/react";
import React, { useContext, useEffect, useState } from "react";
import { OPACITY_ON_LOAD } from "../../Layout/animations";
import GlobalStateContext from "../../Contexts/GlobalStateContext";
@@ -60,25 +60,25 @@ const InvestmentOpportunities = ({ showSearch = true, selectStyle = {} }) => {
),
"Amount Remaining %": (
-
+
- {`${parseFloat(item?.Amount_remaining_per || 0).toLocaleString(
+ {parseFloat(item?.Amount_remaining_per || 0).toLocaleString(
undefined,
{
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}
- )} %`}
+ )}%
),
"Total Deal Size": (
- {`$ ${parseFloat(item?.Deal_size || 0).toLocaleString(undefined, {
+ ${parseFloat(item?.Deal_size || 0).toLocaleString(undefined, {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
- })}`}
+ })}
),
From 390ec27e35432ca412ab065b1586ee2144237862 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Wed, 15 Jan 2025 19:59:53 +0530
Subject: [PATCH 12/50] update icon size
---
src/Pages/Dashboard/Dashbaord.jsx | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/Pages/Dashboard/Dashbaord.jsx b/src/Pages/Dashboard/Dashbaord.jsx
index 21eb122..3ef01e5 100644
--- a/src/Pages/Dashboard/Dashbaord.jsx
+++ b/src/Pages/Dashboard/Dashbaord.jsx
@@ -228,7 +228,7 @@ const Dashbaord = ({ showSearch = false }) => {
{panddingReguest.map((item, index) => (
-
+
@@ -249,15 +249,18 @@ const Dashbaord = ({ showSearch = false }) => {
{userActivity.map((item, index) => (
-
+
{item.icon === IconSix ? (
-
+
+ ) : item.icon === IconSeven ? (
+
) : (
)}
+
Date: Thu, 16 Jan 2025 15:47:22 +0530
Subject: [PATCH 13/50] [fixed] - spell correct
---
src/Pages/Dashboard/Dashbaord.jsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Pages/Dashboard/Dashbaord.jsx b/src/Pages/Dashboard/Dashbaord.jsx
index 3ef01e5..181dedb 100644
--- a/src/Pages/Dashboard/Dashbaord.jsx
+++ b/src/Pages/Dashboard/Dashbaord.jsx
@@ -117,7 +117,7 @@ const Dashbaord = ({ showSearch = false }) => {
},
{
icon: IconOne,
- label: "Total assets under managemnet",
+ label: "Total assets under management",
count: `$ ${parseFloat(
data?.data?.investmentOpportunity?.closedOpportunityDetails?.totalAUM ||
0
@@ -470,7 +470,7 @@ const Dashbaord = ({ showSearch = false }) => {
Sum of users available wallet cash in
-
+
{walletCase.slice(0, 4).map((item, index) => (
From f9b1f820c22ec5a842605a0b48b8ff915e017707 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Thu, 16 Jan 2025 15:55:42 +0530
Subject: [PATCH 14/50] [working Reversal]
---
.../BankDepositRequest/BankDepositRequest.jsx | 413 ++++++++++++++++++
src/Pages/BankDepositRequest/ConfirmModal.jsx | 137 ++++++
src/Pages/BankDepositRequest/RejectModal.jsx | 98 +++++
.../Dashboard/InvestmentOpportunities.jsx | 2 +-
.../ReversalAccountDeletion/ConfirmModal.jsx | 137 ++++++
.../ReversalAccountDeletion/RejectModal.jsx | 98 +++++
.../ReversalAccountDeletion.jsx | 322 ++++++++++++++
.../ReversalFawateerDeposit/ConfirmModal.jsx | 137 ++++++
.../ReversalFawateerDeposit/RejectModal.jsx | 98 +++++
.../ReversalFawateerDeposit.jsx | 390 +++++++++++++++++
src/Routes/Nav.js | 28 ++
src/Routes/Routes.js | 8 +
12 files changed, 1867 insertions(+), 1 deletion(-)
create mode 100644 src/Pages/BankDepositRequest/BankDepositRequest.jsx
create mode 100644 src/Pages/BankDepositRequest/ConfirmModal.jsx
create mode 100644 src/Pages/BankDepositRequest/RejectModal.jsx
create mode 100644 src/Pages/ReversalAccountDeletion/ConfirmModal.jsx
create mode 100644 src/Pages/ReversalAccountDeletion/RejectModal.jsx
create mode 100644 src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
create mode 100644 src/Pages/ReversalFawateerDeposit/ConfirmModal.jsx
create mode 100644 src/Pages/ReversalFawateerDeposit/RejectModal.jsx
create mode 100644 src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
diff --git a/src/Pages/BankDepositRequest/BankDepositRequest.jsx b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
new file mode 100644
index 0000000..f6b3c21
--- /dev/null
+++ b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
@@ -0,0 +1,413 @@
+import {
+ Badge,
+ Box,
+ Button,
+ HStack,
+ Input,
+ Switch,
+ Text,
+ Tooltip,
+ useToast,
+ useDisclosure,
+ Link,
+} from "@chakra-ui/react";
+import React, { useContext, useEffect, useState } from "react";
+import { useNavigate } from "react-router-dom";
+
+import { CheckIcon, CloseIcon, ExternalLinkIcon } from "@chakra-ui/icons";
+import { debounce } from "../Admin/Contact";
+import { OPACITY_ON_LOAD } from "../../Layout/animations";
+import GlobalStateContext from "../../Contexts/GlobalStateContext";
+import CustomAlertDialog from "../../Components/CustomAlertDialog";
+import ToastBox from "../../Components/ToastBox";
+import NormalTable from "../../Components/DataTable/NormalTable";
+import { TABLE_PAGINATION } from "../../Constants/Paginations";
+import { generateSerialNumber } from "../../Constants/Constants";
+import { useGetDepositHistoryQuery } from "../../Services/deposit.request.service";
+import Pagination from "../../Components/Pagination";
+import ConfirmModal from "./ConfirmModal";
+import RejectModal from "./RejectModal";
+
+const formatDate = (date) => {
+ return new Date(date).toLocaleDateString("en-GB", {
+ day: "2-digit",
+ month: "2-digit",
+ year: "numeric",
+ });
+}; // Simple date formatter
+
+const BankDepositRequest = () => {
+ const navigate = useNavigate();
+ const toast = useToast();
+ const { depositHistory, setDepositHistory, slideFromRight } =
+ useContext(GlobalStateContext);
+ const [isLoading, setIsLoading] = useState(true);
+ const [deleteAlert, setDeleteAlert] = useState(false);
+ const [actionId, setActionId] = useState(false);
+ const [mouseEntered, setMouseEntered] = useState(false);
+ const [mouseEnteredId, setMouseEnteredId] = useState("");
+ const {
+ isOpen: isConfirmOpen,
+ onOpen: onConfirmOpen,
+ onClose: onConfirmClose,
+ } = useDisclosure();
+ const {
+ isOpen: isRejectOpen,
+ onOpen: onRejectOpen,
+ onClose: onRejectClose,
+ } = useDisclosure();
+
+ // =========================== [Use State] =============================
+ const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
+ const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
+ 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]);
+
+ const {
+ data,
+ error,
+ refetch,
+ isLoading: depositHistoryLoading,
+ } = useGetDepositHistoryQuery(
+ {
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+ search: debouncedSearchTerm,
+ },
+ {
+ skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
+ }
+ );
+
+ // Use useEffect to refetch data when the component mounts
+ useEffect(() => {
+ refetch();
+ }, [refetch]);
+
+ // ====================================================[Table Setup]================================================================
+ const tableHeadRow = [
+ "Sr.no",
+ "Request Date",
+ "Client ID",
+ "First Name",
+ "Last Name",
+ "Country",
+ "Phone Number",
+ "Deposit Amount",
+ "Deposit Date",
+ "Status",
+ "Supporting's",
+ "Action",
+ ];
+
+ const handleUpdateStatus = debounce((id) => {
+ setDepositHistory((prevDepositHistory) =>
+ prevDepositHistory.map((depositHistory) =>
+ depositHistory.id === id
+ ? { ...depositHistory, status: !depositHistory.status }
+ : depositHistory
+ )
+ );
+ toast({
+ render: () => ,
+ });
+ }, 300);
+
+ const filteredData = data?.data?.rows
+ .filter((item) => {
+ // Filter by name (case insensitive)
+ const name = [item.firstName, item.lastName, item.countryName]
+ .filter(Boolean)
+ .join(" ");
+ const searchLower = searchTerm.toLowerCase();
+ const nameMatches = name.toLowerCase().includes(searchLower);
+
+ // Filter by status (Uncomment and use if needed)
+ // const status = item.status;
+ // const statusLower = status ? "active" : "inactive";
+
+ // const statusMatches =
+ // statusFilter === "all" ||
+ // (statusFilter === "active" && status === true) ||
+ // (statusFilter === "inactive" && status === false);
+
+ return nameMatches;
+ })
+ .sort((b, a) => new Date(a.createdAt) - new Date(b.createdAt));
+
+ // const handleView = (id) => {
+ // setActionId(id);
+ // onViewOpen();
+ // };
+
+ const extractedArray = data?.data?.rows?.map((item, idx) => ({
+ "Sr.no": (
+
+ {generateSerialNumber(idx, currentPage, pageSize)}
+
+ ),
+ "Client ID": (
+
+ {item?.clientReference_id}
+
+ ),
+ "First Name": (
+
+
+ {item?.firstName}
+
+
+ ),
+ "Last Name": (
+
+
+ {item?.lastName}
+
+
+ ),
+ Country: (
+
+
+ {item?.countryName}
+
+
+ ),
+ "Phone Number": (
+
+
+ {item?.mobileNumber}
+
+
+ ),
+ "Deposit Amount": (
+
+
+ {parseFloat(item?.investorAmount || 0).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}
+
+ {item?.currencyCode}
+
+
+
+ ),
+ "Deposit Date": (
+
+ {formatDate(item?.createdAt)}
+
+ ),
+ Status: (
+
+
+ {item.transactionStatus}
+
+
+ ),
+ "Supporting's":
+ item.transactionStatus === "Approved" ? (
+
+ {/* {item?.supporting_FileName} */}
+
+
+
+ View
+
+
+
+ {/*
+ View
+ */}
+
+
+ ) : (
+ ""
+ ),
+ Action: (
+
+
+
+
+
+
+
+
+ ),
+ }));
+
+ const handleDelete = () => {
+ const IOtype = investmentType.filter(
+ (investmentType) => investmentType.id !== actionId
+ );
+
+ setTimeout(() => {
+ setInvestmentType(IOtype);
+ setDeleteAlert(false);
+ setIsLoading(false);
+ }, 100);
+ setIsLoading(true);
+ };
+
+ return (
+
+
+
+
+
+ setSearchTerm(e.target.value)}
+ />
+
+
+
+
+
+
+
+
+
+ setDeleteAlert(false)}
+ isOpen={deleteAlert}
+ message={"Are you sure you want to delete sponers?"}
+ alertHandler={handleDelete}
+ isLoading={isLoading}
+ />
+
+ );
+};
+
+export default BankDepositRequest;
diff --git a/src/Pages/BankDepositRequest/ConfirmModal.jsx b/src/Pages/BankDepositRequest/ConfirmModal.jsx
new file mode 100644
index 0000000..40bcbdd
--- /dev/null
+++ b/src/Pages/BankDepositRequest/ConfirmModal.jsx
@@ -0,0 +1,137 @@
+import {
+ Box,
+ Button,
+ Checkbox,
+ FormControl,
+ FormLabel,
+ Input,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Text,
+ Textarea,
+ useDisclosure,
+} from "@chakra-ui/react";
+import React, { useState } from "react";
+import * as yup from "yup";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { useForm } from "react-hook-form";
+
+export const conformModalSchema = yup.object().shape({
+ fees: yup.string().required("File name is required"),
+ totalAmount: yup.string().required("File name is required"),
+});
+
+const ConfirmModal = ({ isOpen, onClose, firstField }) => {
+
+ const [emailApproval,setEmailApproval] = useState(false)
+
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm({
+ resolver: yupResolver(conformModalSchema),
+ });
+
+ const onSubmit = (data) => {
+ setFile(data.document[0]);
+
+ const newDocument = {
+ ...data,
+ document: data.document[0].name, // Store the document name
+ status: true,
+ id: uuidv4(),
+ createdAt: new Date().toISOString(),
+ Type: getFileIcon(file.type),
+ };
+
+ setCreate((prevCreate) => [...prevCreate, newDocument]);
+ onClose();
+ };
+
+ const handleFileChange = (event) => {
+ const selectedFile = event.target.files[0];
+ setFile(selectedFile);
+ };
+
+ return (
+
+
+
+ Confirm
+
+
+
+
+ Comment
+
+ {errors.comment && (
+
+ {errors.comment.message}
+
+ )}
+
+
+ setEmailApproval(e.target.checked)}
+ >
+ Send an email to the user upon approval
+
+ {emailApproval &&
+
+ Subject
+
+
+
+ Message
+
+
+ }
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ConfirmModal;
diff --git a/src/Pages/BankDepositRequest/RejectModal.jsx b/src/Pages/BankDepositRequest/RejectModal.jsx
new file mode 100644
index 0000000..df2b79f
--- /dev/null
+++ b/src/Pages/BankDepositRequest/RejectModal.jsx
@@ -0,0 +1,98 @@
+import {
+ Box,
+ Button,
+ FormControl,
+ FormLabel,
+ Input,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Text,
+ Textarea,
+ useDisclosure,
+} from "@chakra-ui/react";
+import React from "react";
+import * as yup from "yup";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { useForm } from "react-hook-form";
+
+export const conformModalSchema = yup.object().shape({
+ comment: yup.string().required("Comment is required"),
+});
+
+const RejectModal = ({ isOpen, onClose, firstField }) => {
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm({
+ resolver: yupResolver(conformModalSchema),
+ });
+
+ const onSubmit = (data) => {
+ setFile(data.document[0]);
+
+ const newDocument = {
+ ...data,
+ document: data.document[0].name, // Store the document name
+ comment: true,
+ id: uuidv4(),
+ Type: getFileIcon(file.type),
+ };
+
+ setCreate((prevCreate) => [...prevCreate, newDocument]);
+ onClose();
+ };
+
+ const handleFileChange = (event) => {
+ const selectedFile = event.target.files[0];
+ setFile(selectedFile);
+ };
+
+ return (
+
+
+
+ Reject
+
+
+
+
+ Comment
+
+ {errors.comment && (
+
+ {errors.comment.message}
+
+ )}
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default RejectModal;
diff --git a/src/Pages/Dashboard/InvestmentOpportunities.jsx b/src/Pages/Dashboard/InvestmentOpportunities.jsx
index f06e633..f2e823c 100644
--- a/src/Pages/Dashboard/InvestmentOpportunities.jsx
+++ b/src/Pages/Dashboard/InvestmentOpportunities.jsx
@@ -60,7 +60,7 @@ const InvestmentOpportunities = ({ showSearch = true, selectStyle = {} }) => {
),
"Amount Remaining %": (
-
+
{parseFloat(item?.Amount_remaining_per || 0).toLocaleString(
undefined,
diff --git a/src/Pages/ReversalAccountDeletion/ConfirmModal.jsx b/src/Pages/ReversalAccountDeletion/ConfirmModal.jsx
new file mode 100644
index 0000000..40bcbdd
--- /dev/null
+++ b/src/Pages/ReversalAccountDeletion/ConfirmModal.jsx
@@ -0,0 +1,137 @@
+import {
+ Box,
+ Button,
+ Checkbox,
+ FormControl,
+ FormLabel,
+ Input,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Text,
+ Textarea,
+ useDisclosure,
+} from "@chakra-ui/react";
+import React, { useState } from "react";
+import * as yup from "yup";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { useForm } from "react-hook-form";
+
+export const conformModalSchema = yup.object().shape({
+ fees: yup.string().required("File name is required"),
+ totalAmount: yup.string().required("File name is required"),
+});
+
+const ConfirmModal = ({ isOpen, onClose, firstField }) => {
+
+ const [emailApproval,setEmailApproval] = useState(false)
+
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm({
+ resolver: yupResolver(conformModalSchema),
+ });
+
+ const onSubmit = (data) => {
+ setFile(data.document[0]);
+
+ const newDocument = {
+ ...data,
+ document: data.document[0].name, // Store the document name
+ status: true,
+ id: uuidv4(),
+ createdAt: new Date().toISOString(),
+ Type: getFileIcon(file.type),
+ };
+
+ setCreate((prevCreate) => [...prevCreate, newDocument]);
+ onClose();
+ };
+
+ const handleFileChange = (event) => {
+ const selectedFile = event.target.files[0];
+ setFile(selectedFile);
+ };
+
+ return (
+
+
+
+ Confirm
+
+
+
+
+ Comment
+
+ {errors.comment && (
+
+ {errors.comment.message}
+
+ )}
+
+
+ setEmailApproval(e.target.checked)}
+ >
+ Send an email to the user upon approval
+
+ {emailApproval &&
+
+ Subject
+
+
+
+ Message
+
+
+ }
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ConfirmModal;
diff --git a/src/Pages/ReversalAccountDeletion/RejectModal.jsx b/src/Pages/ReversalAccountDeletion/RejectModal.jsx
new file mode 100644
index 0000000..df2b79f
--- /dev/null
+++ b/src/Pages/ReversalAccountDeletion/RejectModal.jsx
@@ -0,0 +1,98 @@
+import {
+ Box,
+ Button,
+ FormControl,
+ FormLabel,
+ Input,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Text,
+ Textarea,
+ useDisclosure,
+} from "@chakra-ui/react";
+import React from "react";
+import * as yup from "yup";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { useForm } from "react-hook-form";
+
+export const conformModalSchema = yup.object().shape({
+ comment: yup.string().required("Comment is required"),
+});
+
+const RejectModal = ({ isOpen, onClose, firstField }) => {
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm({
+ resolver: yupResolver(conformModalSchema),
+ });
+
+ const onSubmit = (data) => {
+ setFile(data.document[0]);
+
+ const newDocument = {
+ ...data,
+ document: data.document[0].name, // Store the document name
+ comment: true,
+ id: uuidv4(),
+ Type: getFileIcon(file.type),
+ };
+
+ setCreate((prevCreate) => [...prevCreate, newDocument]);
+ onClose();
+ };
+
+ const handleFileChange = (event) => {
+ const selectedFile = event.target.files[0];
+ setFile(selectedFile);
+ };
+
+ return (
+
+
+
+ Reject
+
+
+
+
+ Comment
+
+ {errors.comment && (
+
+ {errors.comment.message}
+
+ )}
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default RejectModal;
diff --git a/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx b/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
new file mode 100644
index 0000000..1feef60
--- /dev/null
+++ b/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
@@ -0,0 +1,322 @@
+import {
+ Avatar,
+ Badge,
+ Box,
+ Button,
+ HStack,
+ Input,
+ Text,
+ Tooltip,
+ useDisclosure,
+ useToast,
+ } from "@chakra-ui/react";
+ import React, { useContext, useEffect, useState } from "react";
+ import { OPACITY_ON_LOAD } from "../../Layout/animations";
+ import NormalTable from "../../Components/DataTable/NormalTable";
+ import Pagination from "../../Components/Pagination";
+ import GlobalStateContext from "../../Contexts/GlobalStateContext";
+ import CustomAlertDialog from "../../Components/CustomAlertDialog";
+ import { formatDate } from "../../Components/Functions/UTCConvertor";
+ import { CheckIcon, CloseIcon } from "@chakra-ui/icons";
+ import { useGetDeleteHistoryQuery } from "../../Services/delete.request.service";
+ import { TABLE_PAGINATION } from "../../Constants/Paginations";
+import ConfirmModal from "./ConfirmModal";
+import RejectModal from "./RejectModal";
+ // import { formatDate } from "../../Components/Functions/UTCConvertor";
+
+ const ReversalAccountDeletion = () => {
+ const toast = useToast();
+ const { slideFromRight, setDeleteHistory } =
+ useContext(GlobalStateContext);
+ const [deleteAlert, setDeleteAlert] = useState(false);
+ const [actionId, setActionId] = useState(false);
+ const [mouseEntered, setMouseEntered] = useState(false);
+ const [mouseEnteredId, setMouseEnteredId] = useState("");
+
+
+
+ // =========================== [Use State] =============================
+ const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
+ const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
+ const [searchTerm, setSearchTerm] = useState("");
+ const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
+
+ const {
+ isOpen: isConfirmOpen,
+ onOpen: onConfirmOpen,
+ onClose: onConfirmClose,
+ } = useDisclosure();
+ const {
+ isOpen: isRejectOpen,
+ onOpen: onRejectOpen,
+ onClose: onRejectClose,
+ } = useDisclosure();
+
+ // 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]);
+
+
+ const {
+ data: deleteHistory,
+ isLoading,
+ refetch
+ } = useGetDeleteHistoryQuery({
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+ search: debouncedSearchTerm,
+ },
+ {
+ skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
+ })
+
+ const formatDate = (date) => {
+ return new Date(date).toLocaleDateString('en-GB', {
+ day: '2-digit',
+ month: '2-digit',
+ year: 'numeric',
+ });
+ };
+
+ // Use useEffect to refetch data when the component mounts
+ useEffect(() => {
+ refetch();
+ }, [refetch]);
+
+
+ // ====================================================[Table Setup]================================================================
+ const tableHeadRow = [
+ "Sr No.",
+ "Request On",
+ "Client ID",
+ "First Name",
+ "Last Name",
+ "Country",
+ "Phone Number",
+ "Action"
+ ];
+
+ const extractedArray = deleteHistory?.data?.rows?.map((item, index) => ({
+ id: item?.id,
+ "Sr No.": (
+
+ {index + 1}.
+
+ ),
+ "Request On": (
+
+ {formatDate(item.Requested_on)}
+
+ ),
+ "Client ID": (
+
+ {item.clientId}
+
+ ),
+ "First Name": (
+
+ {item.firstName}
+ {/* {formatDate(item.charge)} */}
+
+ ),
+ "Last Name": (
+
+ {item.lastName}
+
+ ),
+ "Country": (
+
+ {item.country}
+
+ ),
+ "Phone Number": (
+
+ {item.phoneNumber}
+
+ ),
+ "Action": (
+
+
+
+
+
+
+
+
+ ),
+ }));
+
+ const handleDelete = () => {
+ const deleteHistory = sponser.filter(
+ (sponsor) => sponsor.id !== actionId
+ );
+
+ setTimeout(() => {
+ setSponser(deleteHistory);
+ setDeleteAlert(false);
+ setIsLoading(false);
+ }, 100);
+ setIsLoading(true);
+ };
+
+ return (
+
+
+
+ setSearchTerm(e.target.value)}
+ />
+
+ {/*
+
+ */}
+
+
+
+
+
+ setDeleteAlert(false)}
+ isOpen={deleteAlert}
+ message={"Are you sure you want to delete sponers?"}
+ alertHandler={handleDelete}
+ isLoading={isLoading}
+ />
+
+
+
+ );
+ };
+
+ export default ReversalAccountDeletion;
+
\ No newline at end of file
diff --git a/src/Pages/ReversalFawateerDeposit/ConfirmModal.jsx b/src/Pages/ReversalFawateerDeposit/ConfirmModal.jsx
new file mode 100644
index 0000000..40bcbdd
--- /dev/null
+++ b/src/Pages/ReversalFawateerDeposit/ConfirmModal.jsx
@@ -0,0 +1,137 @@
+import {
+ Box,
+ Button,
+ Checkbox,
+ FormControl,
+ FormLabel,
+ Input,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Text,
+ Textarea,
+ useDisclosure,
+} from "@chakra-ui/react";
+import React, { useState } from "react";
+import * as yup from "yup";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { useForm } from "react-hook-form";
+
+export const conformModalSchema = yup.object().shape({
+ fees: yup.string().required("File name is required"),
+ totalAmount: yup.string().required("File name is required"),
+});
+
+const ConfirmModal = ({ isOpen, onClose, firstField }) => {
+
+ const [emailApproval,setEmailApproval] = useState(false)
+
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm({
+ resolver: yupResolver(conformModalSchema),
+ });
+
+ const onSubmit = (data) => {
+ setFile(data.document[0]);
+
+ const newDocument = {
+ ...data,
+ document: data.document[0].name, // Store the document name
+ status: true,
+ id: uuidv4(),
+ createdAt: new Date().toISOString(),
+ Type: getFileIcon(file.type),
+ };
+
+ setCreate((prevCreate) => [...prevCreate, newDocument]);
+ onClose();
+ };
+
+ const handleFileChange = (event) => {
+ const selectedFile = event.target.files[0];
+ setFile(selectedFile);
+ };
+
+ return (
+
+
+
+ Confirm
+
+
+
+
+ Comment
+
+ {errors.comment && (
+
+ {errors.comment.message}
+
+ )}
+
+
+ setEmailApproval(e.target.checked)}
+ >
+ Send an email to the user upon approval
+
+ {emailApproval &&
+
+ Subject
+
+
+
+ Message
+
+
+ }
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ConfirmModal;
diff --git a/src/Pages/ReversalFawateerDeposit/RejectModal.jsx b/src/Pages/ReversalFawateerDeposit/RejectModal.jsx
new file mode 100644
index 0000000..df2b79f
--- /dev/null
+++ b/src/Pages/ReversalFawateerDeposit/RejectModal.jsx
@@ -0,0 +1,98 @@
+import {
+ Box,
+ Button,
+ FormControl,
+ FormLabel,
+ Input,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Text,
+ Textarea,
+ useDisclosure,
+} from "@chakra-ui/react";
+import React from "react";
+import * as yup from "yup";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { useForm } from "react-hook-form";
+
+export const conformModalSchema = yup.object().shape({
+ comment: yup.string().required("Comment is required"),
+});
+
+const RejectModal = ({ isOpen, onClose, firstField }) => {
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm({
+ resolver: yupResolver(conformModalSchema),
+ });
+
+ const onSubmit = (data) => {
+ setFile(data.document[0]);
+
+ const newDocument = {
+ ...data,
+ document: data.document[0].name, // Store the document name
+ comment: true,
+ id: uuidv4(),
+ Type: getFileIcon(file.type),
+ };
+
+ setCreate((prevCreate) => [...prevCreate, newDocument]);
+ onClose();
+ };
+
+ const handleFileChange = (event) => {
+ const selectedFile = event.target.files[0];
+ setFile(selectedFile);
+ };
+
+ return (
+
+
+
+ Reject
+
+
+
+
+ Comment
+
+ {errors.comment && (
+
+ {errors.comment.message}
+
+ )}
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default RejectModal;
diff --git a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
new file mode 100644
index 0000000..7d7b244
--- /dev/null
+++ b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
@@ -0,0 +1,390 @@
+import {
+ Avatar,
+ Badge,
+ Box,
+ Button,
+ HStack,
+ Input,
+ Link,
+ Text,
+ Tooltip,
+ useDisclosure,
+ useToast,
+ } from "@chakra-ui/react";
+ import React, { useContext, useEffect, useState } from "react";
+ import { CheckIcon, CloseIcon, ExternalLinkIcon } from "@chakra-ui/icons";
+import Pagination from "../../Components/Pagination";
+import GlobalStateContext from "../../Contexts/GlobalStateContext";
+import CustomAlertDialog from "../../Components/CustomAlertDialog";
+import DrawalRequestReject from "../WithDrawal/DrawalRequest/DrawalRequestReject";
+import NormalTable from "../../Components/DataTable/NormalTable";
+import DrawalRequestApprove from "../WithDrawal/DrawalRequest/DrawalRequestApprove";
+import { generateSerialNumber } from "../../Constants/Constants";
+import { TABLE_PAGINATION } from "../../Constants/Paginations";
+import { OPACITY_ON_LOAD } from "../../Layout/animations";
+import { useGetFawateerForMakerRequestQuery } from "../../Services/fawateer.request.service";
+import ConfirmModal from "./ConfirmModal";
+import RejectModal from "./RejectModal";
+
+ const ReversalFawateerDeposit = () => {
+ const toast = useToast();
+ const { slideFromRight, approveHistory, setApproveHistory } =
+ useContext(GlobalStateContext);
+ const [searchTerm, setSearchTerm] = useState("");
+ const [isLoading, setIsLoading] = useState(true);
+ const [deleteAlert, setDeleteAlert] = useState(false);
+ const [actionId, setActionId] = useState(false);
+ const [mouseEntered, setMouseEntered] = useState(false);
+ const [mouseEnteredId, setMouseEnteredId] = useState("");
+ const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
+
+ const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
+ const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
+
+ const formatDate = (date) => {
+ return new Date(date).toLocaleDateString("en-GB", {
+ day: "2-digit",
+ month: "2-digit",
+ year: "numeric",
+ });
+ };
+
+ const {
+ isOpen: isConfirmOpen,
+ onOpen: onConfirmOpen,
+ onClose: onConfirmClose,
+ } = useDisclosure();
+ const {
+ isOpen: isRejectOpen,
+ onOpen: onRejectOpen,
+ onClose: onRejectClose,
+ } = useDisclosure();
+
+ const {
+ data,
+ isLoading: drawalRequestLoading,
+ error,
+ refetch
+ } = useGetFawateerForMakerRequestQuery(
+ {
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+ searchTerm: debouncedSearchTerm,
+ },
+ {
+ skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
+ }
+ );
+
+ console.log(data);
+
+ useEffect(() => {
+ const handler = setTimeout(() => {
+ setDebouncedSearchTerm(searchTerm);
+ }, 500); // Adjust delay as needed
+ return () => {
+ clearTimeout(handler);
+ };
+ }, [searchTerm]);
+
+ // Use useEffect to refetch data when the component mounts
+ useEffect(() => {
+ refetch();
+ }, [refetch]);
+
+ useEffect(() => {
+ // Simulate loading
+ const timer = setTimeout(() => {
+ setIsLoading(false);
+ }, 1500);
+
+ // Cleanup the timer on component unmount
+ return () => clearTimeout(timer);
+ }, []);
+
+ // ====================================================[Table Filter]================================================================
+ const filteredData = data?.data?.rows?.filter((item) => {
+ // Filter by name (case insensitive)
+ const name = item.firstName;
+ const searchLower = searchTerm.toLowerCase();
+ const nameMatches = name.toLowerCase().includes(searchLower);
+
+ // Filter by status
+ // const status = item.status;
+ // const statusLower = status ? "active" : "inactive";
+
+ // const statusMatches =
+ // statusFilter === "all" ||
+ // (statusFilter === "active" && status === true) ||
+ // (statusFilter === "inactive" && status === false);
+
+ return nameMatches;
+ });
+
+ // ====================================================[Table Setup]================================================================
+ const tableHeadRow = [
+ "Sr.no",
+ "Client ID",
+ "First Name",
+ "Last Name",
+ "E-mail ID",
+ "Phone Number",
+ "Deposit Date",
+ "Deposit Amount (BHD)",
+ "Support Image",
+ "Action",
+ ];
+
+ const extractedArray = data?.data?.rows?.map((item, idx) => ({
+
+ // id: item?.id,
+ "Sr.no": (
+
+ {generateSerialNumber(idx, currentPage, pageSize)}
+
+ ),
+ "Client ID": (
+
+ {item.clientReference_id}
+
+ ),
+ "First Name": (
+
+
+ {item.firstName}
+
+
+ ),
+ "Last Name": (
+
+
+ {item.lastName}
+
+
+ ),
+ "E-mail ID": (
+
+
+ {item.emailAddress}
+
+
+ ),
+ "Phone Number": (
+
+
+ {item.mobileNumber}
+
+
+ ),
+ "Deposit Date": (
+
+
+ {formatDate(item?.transaction_date)}
+
+
+ ),
+ "Deposit Amount (BHD)": (
+
+
+ {/* {item.investorAmount} */}
+ {parseFloat(item?.transaction_amount || 0).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}
+ {/* {item?.transaction_amount} */}
+
+
+ ),
+ "Support Image": (
+
+ {item?.spportFile_path&&
+
+
+ View
+
+
+
+ }
+
+ ),
+ Action: (
+
+
+
+
+
+
+
+
+ ),
+ }));
+
+ const handleDelete = () => {
+ const updatedSponsors = sponser.filter(
+ (sponsor) => sponsor.id !== actionId
+ );
+
+ setTimeout(() => {
+ setSponser(updatedSponsors);
+ setDeleteAlert(false);
+ setIsLoading(false);
+ }, 100);
+ setIsLoading(true);
+ };
+
+ return (
+
+
+
+ setSearchTerm(e.target.value)}
+ />
+
+
+
+
+
+
+
+ setDeleteAlert(false)}
+ isOpen={deleteAlert}
+ message={"Are you sure you want to delete sponers?"}
+ alertHandler={handleDelete}
+ isLoading={isLoading}
+ />
+
+
+
+ );
+ };
+
+ export default ReversalFawateerDeposit;
+
\ No newline at end of file
diff --git a/src/Routes/Nav.js b/src/Routes/Nav.js
index b7b5f1a..48ae034 100644
--- a/src/Routes/Nav.js
+++ b/src/Routes/Nav.js
@@ -189,6 +189,34 @@ export const nav = [
type: "accordion",
Icon: AiOutlineUserDelete,
},
+
+
+
+ {
+ title: "REVERSAL TRANSACTION",
+ type: "title",
+ },
+ {
+ title: "Bank Deposit Request",
+ type: "single",
+ path: "/bank-deposit-request",
+ Icon: RiBankLine,
+ },
+ {
+ title: "Fawateer Deposit",
+ type: "single",
+ path: "/fawateer-deposit",
+ Icon: TbLayoutDashboard,
+ },
+ {
+ title: "Account Deletion Request",
+ type: "single",
+ path: "/account-deletion-request",
+ Icon: TbLayoutDashboard,
+ },
+
+
+
{
title: "MANAGE ADMIN",
type: "title",
diff --git a/src/Routes/Routes.js b/src/Routes/Routes.js
index a366cf6..56cfaae 100644
--- a/src/Routes/Routes.js
+++ b/src/Routes/Routes.js
@@ -49,6 +49,9 @@ import Profile from "../Pages/Profile/Profile";
import SubAdmin from "../Pages/SubAdmin/SubAdmin";
import SubAdminUpdateCreate from "../Pages/SubAdmin/SubAdminUpdateCreate";
import InvestmentOpportunities from "../Pages/Dashboard/InvestmentOpportunities";
+import BankDepositRequest from "../Pages/BankDepositRequest/BankDepositRequest";
+import ReversalFawateerDeposit from "../Pages/ReversalFawateerDeposit/ReversalFawateerDeposit";
+import ReversalAccountDeletion from "../Pages/ReversalAccountDeletion/ReversalAccountDeletion";
export const RouteLink = [
// =============[ Tanami ]================
@@ -130,7 +133,12 @@ export const RouteLink = [
{ path: "/subadmin", Component: SubAdmin },
{ path: "/subadmin/subadmin-update/:id", Component: SubAdminUpdateCreate },
{ path: "/subadmin/subadmin-update", Component: SubAdminUpdateCreate },
+
+ // ===============[ REVERSAL TRANSACTION ]===============
+ { path: "/bank-deposit-request", Component: BankDepositRequest },
+ { path: "/fawateer-deposit", Component: ReversalFawateerDeposit },
+ { path: "/account-deletion-request", Component: ReversalAccountDeletion },
// ===============[ fawateer ]===============
From d196dffd1264c7de8df3ef16b17e8b4e1d8de085 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Thu, 16 Jan 2025 15:57:18 +0530
Subject: [PATCH 15/50] change bugs
---
src/Pages/Dashboard/Dashbaord.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Pages/Dashboard/Dashbaord.jsx b/src/Pages/Dashboard/Dashbaord.jsx
index 181dedb..d0e6d63 100644
--- a/src/Pages/Dashboard/Dashbaord.jsx
+++ b/src/Pages/Dashboard/Dashbaord.jsx
@@ -335,7 +335,7 @@ const Dashbaord = ({ showSearch = false }) => {
Date: Fri, 17 Jan 2025 13:13:57 +0530
Subject: [PATCH 16/50] [ update reversal service ]
---
src/Layout/DefaultLayout.jsx | 419 ++++++++++--------
.../BankDepositRequest/BankDepositRequest.jsx | 94 +---
src/Pages/BankDepositRequest/ConfirmModal.jsx | 34 +-
.../DepositRequest/DepositRequestReject.jsx | 2 +-
.../DepositViewHistory/DepositHistory.jsx | 15 +
.../EmailNotification/EmailNotification.jsx | 2 +-
.../ApproveHistory/ApproveHistoryMaker.jsx | 15 +
.../ReversalAccountDeletion/ConfirmModal.jsx | 34 +-
.../ReversalAccountDeletion.jsx | 31 +-
.../ReversalFawateerDeposit/ConfirmModal.jsx | 36 +-
.../ReversalFawateerDeposit.jsx | 82 +---
src/Routes/Nav.js | 7 +-
src/Routes/Routes.js | 2 +-
src/Services/bankdeposit.request.service.js | 35 ++
src/Services/deposit.request.service.js | 2 +-
.../reversal.account.deletion.service.js | 22 +
.../reversal.fawateer.deposit.service.js | 22 +
src/Store/Store.js | 9 +
18 files changed, 472 insertions(+), 391 deletions(-)
create mode 100644 src/Services/bankdeposit.request.service.js
create mode 100644 src/Services/reversal.account.deletion.service.js
create mode 100644 src/Services/reversal.fawateer.deposit.service.js
diff --git a/src/Layout/DefaultLayout.jsx b/src/Layout/DefaultLayout.jsx
index cf60667..843de6a 100644
--- a/src/Layout/DefaultLayout.jsx
+++ b/src/Layout/DefaultLayout.jsx
@@ -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 (
-
- Dashboard
-
- );
+ // case path.startsWith("/"):
+ // return (z
+ //
+ // Dashboard
+ //
+ // );
case path.startsWith("/investment-opportunities"):
- return (
-
- dashboard / Open Opportunities
-
- );
+ return (
+
+
+ dashboard / Open Opportunities
+
+ );
case path.startsWith("/sponser"):
return (
@@ -294,6 +297,29 @@ const DashboardLayout = ({ isOnline }) => {
Deletion request
);
+
+ case path.startsWith("/bank-deposit-request"):
+ return (
+
+
+ Bank Deposit Request
+
+ );
+ case path.startsWith("/reversal-fawateer-deposit"):
+ return (
+
+
+ Fawateer Deposit
+
+ );
+ case path.startsWith("/account-deletion-request"):
+ return (
+
+
+ Account Deletion Request
+
+ );
+
case path.startsWith("/bank-investor"):
return (
@@ -312,7 +338,7 @@ const DashboardLayout = ({ isOnline }) => {
return (
- Push Notification
+ Push Notification
);
case path.startsWith("/contact"):
@@ -364,7 +390,7 @@ const DashboardLayout = ({ isOnline }) => {
Deletion request
);
- case path.startsWith("/subadmin"):
+ case path.startsWith("/subadmin"):
return (
@@ -530,12 +556,170 @@ const DashboardLayout = ({ isOnline }) => {
index={openIndex}
onChange={handleAccordionChange}
>
- {filteredNav.map(({ title, type, Icon, submenu, path }, index) => {
- if (type === "accordion") {
- return (
-
+ {filteredNav.map(
+ ({ title, type, Icon, submenu, path }, index) => {
+ if (type === "accordion") {
+ return (
+
+
+
+
+ {/* {Icon && title === "Admin" ? : } */}
+ {Icon && (
+
+ )}
+
+
+ {title}
+
+
+
+
+
+
+ {submenu?.map(
+ (
+ {
+ title: subMenuTitle,
+ path: link,
+ icon: SubIcon,
+ },
+ i
+ ) => (
+
+
+
+
+
+
+ {SubIcon && (
+
+ )}
+
+ {subMenuTitle === "Aprover Request"
+ ? data?.data?.role === "Maker"
+ ? "Create Request"
+ : "Aprover Request"
+ : subMenuTitle}
+
+
+
+
+ )
+ )}
+
+
+ );
+ } else if (type === "title") {
+ return (
+
+ {title}
+
+ );
+ } else if (type === "single") {
+ return (
{
placement="top-start"
color={"blue.800"}
>
-
- }
+
- {/* {Icon && title === "Admin" ? : } */}
- {Icon && (
-
- )}
-
-
- {title}
-
-
-
-
+ {title}
+
+
-
- {submenu?.map(
- (
- { title: subMenuTitle, path: link, icon: SubIcon },
- i
- ) => (
-
-
-
-
-
-
- {SubIcon && (
-
- )}
-
- {subMenuTitle === "Aprover Request"
- ? data?.data?.role === "Maker"
- ? "Create Request"
- : "Aprover Request"
- : subMenuTitle}
-
-
-
-
- )
- )}
-
-
- );
- } else if (type === "title") {
- return (
-
- {title}
-
- );
- } else if (type === "single") {
- return (
-
-
- {Icon && }
-
- {title}
-
-
-
- );
- } else {
- return null;
+ );
+ } else {
+ return null;
+ }
}
- })}
+ )}
diff --git a/src/Pages/BankDepositRequest/BankDepositRequest.jsx b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
index f6b3c21..00524f4 100644
--- a/src/Pages/BankDepositRequest/BankDepositRequest.jsx
+++ b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
@@ -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)}
),
+ "Request Date": (
+
+ {formatDate(item?.createdAt)}
+
+ ),
"Client ID": (
{
),
- "Deposit Amount": (
-
-
- {parseFloat(item?.investorAmount || 0).toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
-
- {item?.currencyCode}
-
-
-
- ),
- "Deposit Date": (
-
- {formatDate(item?.createdAt)}
-
- ),
- Status: (
-
-
- {item.transactionStatus}
-
-
- ),
- "Supporting's":
- item.transactionStatus === "Approved" ? (
-
- {/* {item?.supporting_FileName} */}
-
-
-
- View
-
-
-
- {/*
- View
- */}
-
-
- ) : (
- ""
- ),
Action: (
{
setFile(selectedFile);
};
+ const modules = {
+ toolbar: [
+ // [{ header: "1" }, { header: "2" },
+ // // { font: [] }
+ // ],
+ // [{ size: [] }],
+ ["bold", "italic", "underline", "strike", "blockquote"],
+ [{ list: "ordered" }, { list: "bullet" }],
+ ["clean"],
+ ],
+ };
+
return (
@@ -104,18 +117,17 @@ const ConfirmModal = ({ isOpen, onClose, firstField }) => {
size="sm"
/>
-
+
Message
-
}
diff --git a/src/Pages/Deposit/DepositRequest/DepositRequestReject.jsx b/src/Pages/Deposit/DepositRequest/DepositRequestReject.jsx
index 8a8ea29..8aead10 100644
--- a/src/Pages/Deposit/DepositRequest/DepositRequestReject.jsx
+++ b/src/Pages/Deposit/DepositRequest/DepositRequestReject.jsx
@@ -110,7 +110,7 @@ const DepositRequestReject = ({ isOpen, onClose, firstField ,id}) => {
Investor Comment
{isLoading ? (
-
+
) : (
diff --git a/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx b/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
index 787fddf..75867a1 100644
--- a/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
+++ b/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
@@ -109,6 +109,7 @@ const DepositHistory = () => {
"Deposit Date",
"Status",
"Supporting's",
+ "Reversal"
];
const handleUpdateStatus = debounce((id) => {
@@ -283,6 +284,20 @@ const DepositHistory = () => {
) : (
""
),
+ "Reversal": (
+
+
+ {item?.reversal === true ? "Initiate Reversal" : "Under Process"}
+
+
+ ),
}));
const handleDelete = () => {
diff --git a/src/Pages/EmailNotification/EmailNotification.jsx b/src/Pages/EmailNotification/EmailNotification.jsx
index 22d5c98..ad456ab 100644
--- a/src/Pages/EmailNotification/EmailNotification.jsx
+++ b/src/Pages/EmailNotification/EmailNotification.jsx
@@ -277,7 +277,7 @@ const EmailNotification = () => {
Create Custom body
- ({
@@ -269,6 +270,20 @@ import {
),
+ "Reversal": (
+
+
+ {item?.reversal === true ? "Initiate Reversal" : "Under Process"}
+
+
+ ),
}));
const handleDelete = () => {
diff --git a/src/Pages/ReversalAccountDeletion/ConfirmModal.jsx b/src/Pages/ReversalAccountDeletion/ConfirmModal.jsx
index 40bcbdd..64a4cf1 100644
--- a/src/Pages/ReversalAccountDeletion/ConfirmModal.jsx
+++ b/src/Pages/ReversalAccountDeletion/ConfirmModal.jsx
@@ -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 (
@@ -104,18 +117,17 @@ const ConfirmModal = ({ isOpen, onClose, firstField }) => {
size="sm"
/>
-
+
Message
-
}
diff --git a/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx b/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
index 1feef60..955fa23 100644
--- a/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
+++ b/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
@@ -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}.
),
- "Request On": (
+ "Request Date": (
),
- "Country": (
-
- {item.country}
-
- ),
"Phone Number": (
),
+ "Country": (
+
+ {item.country}
+
+ ),
"Action": (
{
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 (
@@ -104,18 +117,17 @@ const ConfirmModal = ({ isOpen, onClose, firstField }) => {
size="sm"
/>
-
+
Message
-
}
diff --git a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
index 7d7b244..bf1376e 100644
--- a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
+++ b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
@@ -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)}
),
+ "Request Date": (
+
+ {formatDate(item?.createdAt)}
+
+ ),
"Client ID": (
),
- "E-mail ID": (
-
+ "Country": (
+
- {item.emailAddress}
+ {item.lastName}
),
@@ -190,61 +201,6 @@ import RejectModal from "./RejectModal";
),
- "Deposit Date": (
-
-
- {formatDate(item?.transaction_date)}
-
-
- ),
- "Deposit Amount (BHD)": (
-
-
- {/* {item.investorAmount} */}
- {parseFloat(item?.transaction_amount || 0).toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- {/* {item?.transaction_amount} */}
-
-
- ),
- "Support Image": (
-
- {item?.spportFile_path&&
-
-
- View
-
-
-
- }
-
- ),
Action: (
({
+ // ======[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;
diff --git a/src/Services/deposit.request.service.js b/src/Services/deposit.request.service.js
index 1a8ccd2..29cc421 100644
--- a/src/Services/deposit.request.service.js
+++ b/src/Services/deposit.request.service.js
@@ -88,7 +88,7 @@ export const depositRequest = createApi({
// Export hooks for usage in functional components
export const {
useGetDepositRequestQuery,
- useGetDepositRequestByIdQuery,
+ useGetDepositRequestByIdQuery,
useUpdateDepositRequestMutation,
useDepositRejectMutation,
useGetDepositHistoryQuery,
diff --git a/src/Services/reversal.account.deletion.service.js b/src/Services/reversal.account.deletion.service.js
new file mode 100644
index 0000000..068150e
--- /dev/null
+++ b/src/Services/reversal.account.deletion.service.js
@@ -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;
diff --git a/src/Services/reversal.fawateer.deposit.service.js b/src/Services/reversal.fawateer.deposit.service.js
new file mode 100644
index 0000000..6b25bfd
--- /dev/null
+++ b/src/Services/reversal.fawateer.deposit.service.js
@@ -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;
diff --git a/src/Store/Store.js b/src/Store/Store.js
index f3a101c..c6c2a58 100644
--- a/src/Store/Store.js
+++ b/src/Store/Store.js
@@ -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,
),
});
From 7f3dd5aa7996061ba586e7457ae3f130cb8d93c1 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Fri, 17 Jan 2025 13:15:25 +0530
Subject: [PATCH 17/50] Add InitiateReversalPopup component and integrate into
DepositHistory
---
.../Popups/InitiateReversalPopups.jsx | 118 ++++++++++++++++
.../DepositViewHistory/DepositHistory.jsx | 131 ++++++++++--------
2 files changed, 193 insertions(+), 56 deletions(-)
create mode 100644 src/Components/Popups/InitiateReversalPopups.jsx
diff --git a/src/Components/Popups/InitiateReversalPopups.jsx b/src/Components/Popups/InitiateReversalPopups.jsx
new file mode 100644
index 0000000..57f2293
--- /dev/null
+++ b/src/Components/Popups/InitiateReversalPopups.jsx
@@ -0,0 +1,118 @@
+import {
+ Box,
+ Button,
+ FormControl,
+ FormLabel,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Text,
+ Textarea,
+} from "@chakra-ui/react";
+import React from "react";
+import PropTypes from "prop-types";
+
+import * as yup from "yup";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { useForm } from "react-hook-form";
+
+export const conformModalSchema = yup.object().shape({
+ comments: yup
+ .string()
+ .min(2, "Minimum length should be 150 characters.")
+ .max(150, "Maximum length should be 150 characters.")
+ .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
+ .required("Comment is required"),
+});
+
+const InitiateReversalPopup = ({ isOpen, onClose, handelApproved }) => {
+ const {
+ watch,
+ register,
+ reset,
+ handleSubmit,
+ formState: { errors },
+ } = useForm({
+ resolver: yupResolver(conformModalSchema),
+ mode: "all",
+ });
+
+ return (
+
+
+
+ Reversal Reason
+
+ {
+ handelApproved(data);
+ reset();
+ })}
+ >
+
+
+ Comment
+
+
+ {errors.comments ? (
+
+ {errors.comments.message}
+
+ ) : (
+
+ Maximum length should be 150 characters. You have entered{" "}
+ {watch()?.comments?.length || 0} characters.
+
+ )}
+
+
+
+
+
+
+
+
+
+ );
+};
+
+InitiateReversalPopup.propTypes = {
+ isOpen: PropTypes.bool.isRequired,
+ onClose: PropTypes.func.isRequired,
+ handelApproved: PropTypes.func.isRequired,
+};
+
+export default InitiateReversalPopup;
diff --git a/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx b/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
index 787fddf..aacde5d 100644
--- a/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
+++ b/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
@@ -4,39 +4,32 @@ import {
Button,
HStack,
Input,
- Switch,
- Text,
- Tooltip,
- useToast,
- useDisclosure,
Link,
+ Text,
+ useDisclosure,
+ useToast,
} from "@chakra-ui/react";
import React, { useContext, useEffect, useState } from "react";
-import { HiDotsVertical } from "react-icons/hi";
import { useNavigate } from "react-router-dom";
-import { debounce } from "../../Master/Sponser/AddSponser";
-import { OPACITY_ON_LOAD } from "../../../Layout/animations";
-import Pagination from "../../../Components/Pagination";
-import GlobalStateContext from "../../../Contexts/GlobalStateContext";
import CustomAlertDialog from "../../../Components/CustomAlertDialog";
-import ToastBox from "../../../Components/ToastBox";
import NormalTable from "../../../Components/DataTable/NormalTable";
-import ConfirmModal from "./ConfirmModal";
-import RejectModal from "./RejectModal";
-import {
- useDepositRejectMutation,
- useGetDepositHistoryQuery,
-} from "../../../Services/deposit.request.service";
+import Pagination from "../../../Components/Pagination";
+import ToastBox from "../../../Components/ToastBox";
+import GlobalStateContext from "../../../Contexts/GlobalStateContext";
+import { OPACITY_ON_LOAD } from "../../../Layout/animations";
+import { useGetDepositHistoryQuery } from "../../../Services/deposit.request.service";
+import { debounce } from "../../Master/Sponser/AddSponser";
import { ExternalLinkIcon } from "@chakra-ui/icons";
-import { TABLE_PAGINATION } from "../../../Constants/Paginations";
+import InitiateReversalPopup from "../../../Components/Popups/InitiateReversalPopups";
import { generateSerialNumber } from "../../../Constants/Constants";
+import { TABLE_PAGINATION } from "../../../Constants/Paginations";
const formatDate = (date) => {
- return new Date(date).toLocaleDateString('en-GB', {
- day: '2-digit',
- month: '2-digit',
- year: 'numeric',
+ return new Date(date).toLocaleDateString("en-GB", {
+ day: "2-digit",
+ month: "2-digit",
+ year: "numeric",
});
}; // Simple date formatter
@@ -50,22 +43,18 @@ const DepositHistory = () => {
const [actionId, setActionId] = useState(false);
const [mouseEntered, setMouseEntered] = useState(false);
const [mouseEnteredId, setMouseEnteredId] = useState("");
- // const {
- // isOpen: isConfirmOpen,
- // onOpen: onConfirmOpen,
- // onClose: onConfirmClose,
- // } = useDisclosure();
- // const {
- // isOpen: isRejectOpen,
- // onOpen: onRejectOpen,
- // onClose: onRejectClose,
- // } = useDisclosure();
- // =========================== [Use State] =============================
+ // =========================== [Use State] =============================
const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
const [searchTerm, setSearchTerm] = useState("");
const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
+ const [reversalId, setReversalId] = useState();
+ const {
+ isOpen: isOpenInRev,
+ onOpen: onOpenInRev,
+ onClose: onCloseInRev,
+ } = useDisclosure();
// Debounce the search term to avoid making a request on every keystroke
useEffect(() => {
@@ -77,20 +66,21 @@ const DepositHistory = () => {
};
}, [searchTerm]);
-
const {
data,
error,
refetch,
isLoading: depositHistoryLoading,
- } = useGetDepositHistoryQuery({
- page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
- size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
- search: debouncedSearchTerm,
- },
- {
- skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
- });
+ } = useGetDepositHistoryQuery(
+ {
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+ search: debouncedSearchTerm,
+ },
+ {
+ skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
+ }
+ );
// Use useEffect to refetch data when the component mounts
useEffect(() => {
@@ -109,6 +99,7 @@ const DepositHistory = () => {
"Deposit Date",
"Status",
"Supporting's",
+ "Reversal Action",
];
const handleUpdateStatus = debounce((id) => {
@@ -161,7 +152,7 @@ const DepositHistory = () => {
fontWeight={"500"}
className="d-flex align-items-center web-text-small"
>
- {generateSerialNumber(idx,currentPage, pageSize )}
+ {generateSerialNumber(idx, currentPage, pageSize)}
),
"Client ID": (
@@ -205,11 +196,7 @@ const DepositHistory = () => {
),
"Deposit Amount": (
-
+
{parseFloat(item?.investorAmount || 0).toLocaleString(undefined, {
minimumFractionDigits: 2,
@@ -283,6 +270,35 @@ const DepositHistory = () => {
) : (
""
),
+ "Reversal Action": (
+
+ {item.transactionStatus === "Approved" ? (
+
+ {!item.isReversal ? (
+
+ ) : (
+ "Under process"
+ )}
+
+ ) : (
+ ""
+ )}
+
+ ),
}));
const handleDelete = () => {
@@ -298,16 +314,13 @@ const DepositHistory = () => {
setIsLoading(true);
};
+ const handelApproved = async (data) => {
+ console.log(data, reversalId);
+ onCloseInRev();
+ };
+
return (
- {/*
- */}
{
alertHandler={handleDelete}
isLoading={isLoading}
/>
+
+
);
};
From 27d3167acc84617812512bf87bb93159af889ed2 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Fri, 17 Jan 2025 13:28:45 +0530
Subject: [PATCH 18/50] update bank service
---
src/Services/bankdeposit.request.service.js | 34 +++++++++++++++------
1 file changed, 25 insertions(+), 9 deletions(-)
diff --git a/src/Services/bankdeposit.request.service.js b/src/Services/bankdeposit.request.service.js
index 245a4a0..61605d7 100644
--- a/src/Services/bankdeposit.request.service.js
+++ b/src/Services/bankdeposit.request.service.js
@@ -15,21 +15,37 @@ export const bankDepositRequestMaster = createApi({
providesTags: ["getBankDeposit"],
}),
-
- depositReject: builder.mutation({
+ approveBankDepositRequest: builder.mutation({
query: ({ id, data }) => ({
- url: `/deposit/admin/rejected/${id}`,
+ url: `/reversal-transactions/bank-transfer/approve/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getDepositRequest", "getDepositHistory"],
- }),
-
+ }),
+ createBankDepositReversalRequest: builder.mutation({
+ query: ({ id, data }) => ({
+ url: `/reversal-transactions/bank-transfer/create/${id}`,
+ method: "POST",
+ body: data,
+ }),
+ invalidatesTags: ["getDepositRequest", "getDepositHistory"],
+ }),
+
+ rejectbankDepositRequest: builder.mutation({
+ query: ({ id, data }) => ({
+ url: `/reversal-transactions/bank-transfer/reject/${id}`,
+ method: "PATCH",
+ body: data,
+ }),
+ invalidatesTags: ["getDepositRequest", "getDepositHistory"],
+ }),
}),
});
-export const {
- useGetBankDepositMasterQuery,
- useDepositRejectMutation,
- } = bankDepositRequestMaster;
+export const {
+ useGetBankDepositMasterQuery,
+ useApproveBankDepositRequestMutation,
+ useRejectbankDepositRequestMutation,
+} = bankDepositRequestMaster;
From c7856baf4512d9d2e907a5ba47062e0ef24f9f63 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Fri, 17 Jan 2025 13:28:59 +0530
Subject: [PATCH 19/50] Update DepositHistory component: rename "Reversal" to
"Reversal Action" and clean up commented code
---
.../DepositViewHistory/DepositHistory.jsx | 44 +++++++------------
1 file changed, 15 insertions(+), 29 deletions(-)
diff --git a/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx b/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
index 56d2274..95bc9c1 100644
--- a/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
+++ b/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
@@ -99,7 +99,7 @@ const DepositHistory = () => {
"Deposit Date",
"Status",
"Supporting's",
- "Reversal"
+ "Reversal Action",
];
const handleUpdateStatus = debounce((id) => {
@@ -275,7 +275,7 @@ const DepositHistory = () => {
{item.transactionStatus === "Approved" ? (
{!item.isReversal ? (
@@ -299,34 +299,20 @@ const DepositHistory = () => {
)}
),
- "Reversal": (
-
-
- {item?.reversal === true ? "Initiate Reversal" : "Under Process"}
-
-
- ),
}));
- const handleDelete = () => {
- const IOtype = investmentType.filter(
- (investmentType) => investmentType.id !== actionId
- );
+ // const handleDelete = () => {
+ // const IOtype = investmentType.filter(
+ // (investmentType) => investmentType.id !== actionId
+ // );
- setTimeout(() => {
- setInvestmentType(IOtype);
- setDeleteAlert(false);
- setIsLoading(false);
- }, 100);
- setIsLoading(true);
- };
+ // setTimeout(() => {
+ // setInvestmentType(IOtype);
+ // setDeleteAlert(false);
+ // setIsLoading(false);
+ // }, 100);
+ // setIsLoading(true);
+ // };
const handelApproved = async (data) => {
console.log(data, reversalId);
@@ -381,13 +367,13 @@ const DepositHistory = () => {
setMouseEntered={setMouseEntered}
/>
- setDeleteAlert(false)}
isOpen={deleteAlert}
message={"Are you sure you want to delete sponers?"}
alertHandler={handleDelete}
isLoading={isLoading}
- />
+ /> */}
Date: Fri, 17 Jan 2025 14:30:22 +0530
Subject: [PATCH 20/50] Enhance InitiateReversalPopup and DepositHistory: add
loading state and integrate reversal request mutation
---
.../Popups/InitiateReversalPopups.jsx | 12 ++++++-
.../DepositViewHistory/DepositHistory.jsx | 33 +++++++++++++++++--
src/Services/bankdeposit.request.service.js | 3 +-
3 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/src/Components/Popups/InitiateReversalPopups.jsx b/src/Components/Popups/InitiateReversalPopups.jsx
index 57f2293..67faded 100644
--- a/src/Components/Popups/InitiateReversalPopups.jsx
+++ b/src/Components/Popups/InitiateReversalPopups.jsx
@@ -29,7 +29,12 @@ export const conformModalSchema = yup.object().shape({
.required("Comment is required"),
});
-const InitiateReversalPopup = ({ isOpen, onClose, handelApproved }) => {
+const InitiateReversalPopup = ({
+ isOpen,
+ onClose,
+ handelApproved,
+ isLoading,
+}) => {
const {
watch,
register,
@@ -41,6 +46,8 @@ const InitiateReversalPopup = ({ isOpen, onClose, handelApproved }) => {
mode: "all",
});
+ console.log(isLoading);
+
return (
@@ -52,6 +59,7 @@ const InitiateReversalPopup = ({ isOpen, onClose, handelApproved }) => {
onSubmit={handleSubmit((data) => {
handelApproved(data);
reset();
+ onClose()
})}
>
@@ -99,6 +107,7 @@ const InitiateReversalPopup = ({ isOpen, onClose, handelApproved }) => {
size={"sm"}
rounded={"sm"}
type={"submit"}
+ isDisabled={isLoading}
>
Send
@@ -111,6 +120,7 @@ const InitiateReversalPopup = ({ isOpen, onClose, handelApproved }) => {
InitiateReversalPopup.propTypes = {
isOpen: PropTypes.bool.isRequired,
+ isLoading: PropTypes.bool.isRequired,
onClose: PropTypes.func.isRequired,
handelApproved: PropTypes.func.isRequired,
};
diff --git a/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx b/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
index 95bc9c1..4e5a29c 100644
--- a/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
+++ b/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
@@ -6,6 +6,7 @@ import {
Input,
Link,
Text,
+ useBoolean,
useDisclosure,
useToast,
} from "@chakra-ui/react";
@@ -24,6 +25,7 @@ import { ExternalLinkIcon } from "@chakra-ui/icons";
import InitiateReversalPopup from "../../../Components/Popups/InitiateReversalPopups";
import { generateSerialNumber } from "../../../Constants/Constants";
import { TABLE_PAGINATION } from "../../../Constants/Paginations";
+import { useCreateBankDepositReversalRequestMutation } from "../../../Services/bankdeposit.request.service";
const formatDate = (date) => {
return new Date(date).toLocaleDateString("en-GB", {
@@ -44,6 +46,9 @@ const DepositHistory = () => {
const [mouseEntered, setMouseEntered] = useState(false);
const [mouseEnteredId, setMouseEnteredId] = useState("");
+ const [createBankDepositReversalRequest] =
+ useCreateBankDepositReversalRequestMutation();
+
// =========================== [Use State] =============================
const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
@@ -55,6 +60,7 @@ const DepositHistory = () => {
onOpen: onOpenInRev,
onClose: onCloseInRev,
} = useDisclosure();
+ const [isReversalLoading, setIsReversalLoading] = useBoolean();
// Debounce the search term to avoid making a request on every keystroke
useEffect(() => {
@@ -315,8 +321,30 @@ const DepositHistory = () => {
// };
const handelApproved = async (data) => {
- console.log(data, reversalId);
- onCloseInRev();
+ setIsReversalLoading.on;
+ try {
+ const { error, data: responseData } =
+ await createBankDepositReversalRequest({
+ id: reversalId,
+ data,
+ });
+ refetch();
+ toast({
+ render: () => ,
+ });
+ onCloseInRev();
+ if (error) {
+ throw error;
+ }
+ } catch (error) {
+ toast({
+ render: () => (
+
+ ),
+ });
+ console.error("Error:", error);
+ }
+ setIsReversalLoading.off;
};
return (
@@ -379,6 +407,7 @@ const DepositHistory = () => {
onClose={onCloseInRev}
isOpen={isOpenInRev}
handelApproved={handelApproved}
+ isLoading={isReversalLoading}
/>
);
diff --git a/src/Services/bankdeposit.request.service.js b/src/Services/bankdeposit.request.service.js
index 61605d7..8c4b89e 100644
--- a/src/Services/bankdeposit.request.service.js
+++ b/src/Services/bankdeposit.request.service.js
@@ -1,5 +1,5 @@
// Need to use the React-specific entry point to import createApi
-import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
+import { createApi } from "@reduxjs/toolkit/query/react";
import { baseQuery } from "./token.serivce";
// Define a service using a base URL and expected endpoints
@@ -48,4 +48,5 @@ export const {
useGetBankDepositMasterQuery,
useApproveBankDepositRequestMutation,
useRejectbankDepositRequestMutation,
+ useCreateBankDepositReversalRequestMutation,
} = bankDepositRequestMaster;
From c82ef2795899e7162a38af699158903c0373d432 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Fri, 17 Jan 2025 15:19:48 +0530
Subject: [PATCH 21/50] Add mutation endpoints for Fawateer reversal requests
and update DepositHistory component
---
.../DepositViewHistory/DepositHistory.jsx | 34 +-
src/Pages/Fawateer/FawateerRequest.jsx | 148 ++--
.../ApproveHistory/ApproveHistoryMaker.jsx | 753 ++++++++++--------
.../reversal.fawateer.deposit.service.js | 42 +-
4 files changed, 533 insertions(+), 444 deletions(-)
diff --git a/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx b/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
index 4e5a29c..0b7d8f7 100644
--- a/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
+++ b/src/Pages/Deposit/DepositViewHistory/DepositHistory.jsx
@@ -23,7 +23,7 @@ import { debounce } from "../../Master/Sponser/AddSponser";
import { ExternalLinkIcon } from "@chakra-ui/icons";
import InitiateReversalPopup from "../../../Components/Popups/InitiateReversalPopups";
-import { generateSerialNumber } from "../../../Constants/Constants";
+import { generateSerialNumber, isMaker } from "../../../Constants/Constants";
import { TABLE_PAGINATION } from "../../../Constants/Paginations";
import { useCreateBankDepositReversalRequestMutation } from "../../../Services/bankdeposit.request.service";
@@ -105,7 +105,7 @@ const DepositHistory = () => {
"Deposit Date",
"Status",
"Supporting's",
- "Reversal Action",
+ isMaker() && "Reversal Action",
];
const handleUpdateStatus = debounce((id) => {
@@ -320,31 +320,43 @@ const DepositHistory = () => {
// setIsLoading(true);
// };
- const handelApproved = async (data) => {
- setIsReversalLoading.on;
+ const handleApproved = async (data) => {
+ setIsReversalLoading.on(); // Start loading
try {
const { error, data: responseData } =
await createBankDepositReversalRequest({
id: reversalId,
data,
});
+
+ if (error) {
+ throw error; // Explicitly handle the error
+ }
+
+ // Success: Perform necessary actions
refetch();
toast({
- render: () => ,
+ render: () => (
+
+ ),
});
onCloseInRev();
- if (error) {
- throw error;
- }
} catch (error) {
+ // Handle errors
toast({
render: () => (
-
+
),
});
console.error("Error:", error);
+ } finally {
+ setIsReversalLoading.off(); // Ensure loading is toggled off
}
- setIsReversalLoading.off;
};
return (
@@ -406,7 +418,7 @@ const DepositHistory = () => {
diff --git a/src/Pages/Fawateer/FawateerRequest.jsx b/src/Pages/Fawateer/FawateerRequest.jsx
index 0c9311d..1615871 100644
--- a/src/Pages/Fawateer/FawateerRequest.jsx
+++ b/src/Pages/Fawateer/FawateerRequest.jsx
@@ -1,46 +1,25 @@
import {
- Avatar,
Badge,
Box,
- Button,
HStack,
Input,
- Menu,
- MenuButton,
- MenuItem,
- MenuList,
- Portal,
- Select,
- Switch,
- Tag,
Text,
- Tooltip,
useDisclosure,
- useToast,
+ useToast
} from "@chakra-ui/react";
-import React, { useContext, useEffect, useState, useRef } from "react";
-import { OPACITY_ON_LOAD } from "../../Layout/animations";
-import NormalTable from "../../Components/DataTable/NormalTable";
-import { HiDotsVertical } from "react-icons/hi";
-import { Link, Link as RouterLink, useNavigate } from "react-router-dom";
-import {
- AddIcon,
- DeleteIcon,
- EditIcon,
- EmailIcon,
- ViewIcon,
-} from "@chakra-ui/icons";
-import Pagination from "../../Components/Pagination";
-import GlobalStateContext from "../../Contexts/GlobalStateContext";
+import React, { useContext, useEffect, useRef, useState } from "react";
+import { useNavigate } from "react-router-dom";
import CustomAlertDialog from "../../Components/CustomAlertDialog";
+import NormalTable from "../../Components/DataTable/NormalTable";
+import Pagination from "../../Components/Pagination";
import ToastBox from "../../Components/ToastBox";
+import GlobalStateContext from "../../Contexts/GlobalStateContext";
+import { OPACITY_ON_LOAD } from "../../Layout/animations";
import { debounce } from "../Master/Sponser/AddSponser";
// import InvestmentDetailsEdit from "./InvestmentDetailsEdit";
-import { useGetInvestorsQuery } from "../../Services/investor.details.service";
+import { generateSerialNumber } from "../../Constants/Constants";
import { TABLE_PAGINATION } from "../../Constants/Paginations";
-import { exportToExcel, generateSerialNumber } from "../../Constants/Constants";
-import { LuFileSpreadsheet } from "react-icons/lu";
-
+import { useGetInvestorsQuery } from "../../Services/investor.details.service";
const FawateerRequest = () => {
const navigate = useNavigate();
@@ -60,8 +39,7 @@ const FawateerRequest = () => {
} = useDisclosure();
const btnRef = React.useRef();
-
- // =========================== [Use State] =============================
+ // =========================== [Use State] =============================
const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
const [searchTerm, setSearchTerm] = useState("");
@@ -77,21 +55,20 @@ const FawateerRequest = () => {
};
}, [searchTerm]);
-
const {
data: investorDetails,
isLoading: investorDetailsLoading,
error,
- } = useGetInvestorsQuery({
- page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
- size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
- search: debouncedSearchTerm,
- },
- {
- skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
- }
-);
-
+ } = useGetInvestorsQuery(
+ {
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+ search: debouncedSearchTerm,
+ },
+ {
+ skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
+ }
+ );
useEffect(() => {
// Simulate loading
@@ -109,10 +86,10 @@ const FawateerRequest = () => {
"Client ID",
"First Name",
"Last Name",
- "Country",
+ "Country",
"Phone Number",
"E-mail ID",
- // "Type",
+ // "Type",
// "KYC Status",
"Approval Status",
];
@@ -131,7 +108,15 @@ const FawateerRequest = () => {
// ====================================================[Table Filter]================================================================
const filteredData = investorDetails?.data?.rows?.filter((item) => {
// Filter by name (case insensitive)
- const name = [item?.principal?.firstName, item?.principal?.lastName, item?.country?.countryName, item?.principal?.mobileNumber, item?.principal?.emailAddress].filter(Boolean).join(' ');
+ const name = [
+ item?.principal?.firstName,
+ item?.principal?.lastName,
+ item?.country?.countryName,
+ item?.principal?.mobileNumber,
+ item?.principal?.emailAddress,
+ ]
+ .filter(Boolean)
+ .join(" ");
const searchLower = searchTerm.toLowerCase();
const nameMatches = name?.toLowerCase().includes(searchLower);
@@ -147,35 +132,31 @@ const FawateerRequest = () => {
return nameMatches;
});
-
-
const customHeaders = [
{ label: "ID", key: "id" },
{ label: "Client ID", key: "clientReference_id" },
- { label: "First Name", key: "principal.firstName" }, // Nested property
- { label: "Last Name", key: "principal.lastName" }, // Nested property
- { label: "Country", key: "country.countryName" }, // Nested property
+ { label: "First Name", key: "principal.firstName" }, // Nested property
+ { label: "Last Name", key: "principal.lastName" }, // Nested property
+ { label: "Country", key: "country.countryName" }, // Nested property
{ label: "Phone Number", key: "principal.mobileNumber" }, // Nested property
- { label: "E-mail ID", key: "principal.emailAddress" }, // Nested property
+ { label: "E-mail ID", key: "principal.emailAddress" }, // Nested property
{ label: "Type", key: "investor_type.investorTypeName" }, // Nested property
- { label: "Status", key: "ioStatus" }, // Simple property
- { label: "KYC Status", key: "KYCStatus" }, // Simple property
+ { label: "Status", key: "ioStatus" }, // Simple property
+ { label: "KYC Status", key: "KYCStatus" }, // Simple property
];
-
const extractedArray = investorDetails?.data?.rows?.map((item, idx) => ({
id: item?.id,
"Sr No": (
{/* {item.id} */}
- {generateSerialNumber(idx,currentPage, pageSize )}
-
+ {generateSerialNumber(idx, currentPage, pageSize)}
),
"Client ID": (
@@ -183,7 +164,7 @@ const FawateerRequest = () => {
{item.clientReference_id}
-
+
),
"First Name": (
@@ -220,27 +201,33 @@ const FawateerRequest = () => {
),
- "Type": (
+ Type: (
-
-
+
+
{item?.investor_type?.investorTypeName}
),
"Approval Status": (
-
-
- Approved
-
-
+
+
+ Approved
+
+
),
}));
@@ -264,8 +251,6 @@ const FawateerRequest = () => {
console.log(investorDetails?.data?.totalItems);
-
-
return (
@@ -290,23 +275,17 @@ const FawateerRequest = () => {
onChange={(e) => setSearchTerm(e.target.value)}
/>
-
-
-
-
-
-{/*
+ {/*
}
colorScheme="forestGreen"
@@ -317,7 +296,6 @@ const FawateerRequest = () => {
>
Create request
*/}
-
@@ -345,4 +323,4 @@ const FawateerRequest = () => {
);
};
-export default FawateerRequest
\ No newline at end of file
+export default FawateerRequest;
diff --git a/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryMaker.jsx b/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryMaker.jsx
index d3c2fc0..b2e2739 100644
--- a/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryMaker.jsx
+++ b/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryMaker.jsx
@@ -1,230 +1,239 @@
import {
- Avatar,
- Badge,
- Box,
- Button,
- HStack,
- Input,
- Link,
- Text,
- Tooltip,
- useDisclosure,
- useToast,
- } from "@chakra-ui/react";
- import React, { useContext, useEffect, useState } from "react";
- import { CheckIcon, CloseIcon, ExternalLinkIcon } from "@chakra-ui/icons";
- import Pagination from "../../../Components/Pagination";
- import GlobalStateContext from "../../../Contexts/GlobalStateContext";
- import CustomAlertDialog from "../../../Components/CustomAlertDialog";
- import DrawalRequestReject from "../../WithDrawal/DrawalRequest/DrawalRequestReject";
- import NormalTable from "../../../Components/DataTable/NormalTable";
- import DrawalRequestApprove from "../../WithDrawal/DrawalRequest/DrawalRequestApprove";
- import { generateSerialNumber } from "../../../Constants/Constants";
- import {
- useGetApproveHistoryQuery,
- useGetFawateerForMakerRequestQuery,
- useGetFawateerRequestQuery,
- } from "../../../Services/fawateer.request.service";
- import { TABLE_PAGINATION } from "../../../Constants/Paginations";
- import { OPACITY_ON_LOAD } from "../../../Layout/animations";
-
- const ApproveHistoryMaker = () => {
- const toast = useToast();
- const { slideFromRight, approveHistory, setApproveHistory } =
- useContext(GlobalStateContext);
- const [searchTerm, setSearchTerm] = useState("");
- const [isLoading, setIsLoading] = useState(true);
- const [deleteAlert, setDeleteAlert] = useState(false);
- const [actionId, setActionId] = useState(false);
- const [mouseEntered, setMouseEntered] = useState(false);
- const [mouseEnteredId, setMouseEnteredId] = useState("");
- const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
-
- const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
- const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
-
- const formatDate = (date) => {
- return new Date(date).toLocaleDateString("en-GB", {
- day: "2-digit",
- month: "2-digit",
- year: "numeric",
- });
- };
-
- const {
- isOpen: isConfirmOpen,
- onOpen: onConfirmOpen,
- onClose: onConfirmClose,
- } = useDisclosure();
- const {
- isOpen: isRejectOpen,
- onOpen: onRejectOpen,
- onClose: onRejectClose,
- } = useDisclosure();
+ Avatar,
+ Badge,
+ Box,
+ Button,
+ HStack,
+ Input,
+ Link,
+ Text,
+ Tooltip,
+ useBoolean,
+ useDisclosure,
+ useToast,
+} from "@chakra-ui/react";
+import React, { useContext, useEffect, useState } from "react";
+import { CheckIcon, CloseIcon, ExternalLinkIcon } from "@chakra-ui/icons";
+import Pagination from "../../../Components/Pagination";
+import GlobalStateContext from "../../../Contexts/GlobalStateContext";
+import CustomAlertDialog from "../../../Components/CustomAlertDialog";
+import DrawalRequestReject from "../../WithDrawal/DrawalRequest/DrawalRequestReject";
+import NormalTable from "../../../Components/DataTable/NormalTable";
+import DrawalRequestApprove from "../../WithDrawal/DrawalRequest/DrawalRequestApprove";
+import { generateSerialNumber, isMaker } from "../../../Constants/Constants";
+import {
+ useGetApproveHistoryQuery,
+ useGetFawateerForMakerRequestQuery,
+ useGetFawateerRequestQuery,
+} from "../../../Services/fawateer.request.service";
+import { TABLE_PAGINATION } from "../../../Constants/Paginations";
+import { OPACITY_ON_LOAD } from "../../../Layout/animations";
+import InitiateReversalPopup from "../../../Components/Popups/InitiateReversalPopups";
+import ToastBox from "../../../Components/ToastBox";
+import { useCreateFawateerReversalRequestMutation } from "../../../Services/reversal.fawateer.deposit.service";
- const {
- data,
- isLoading: drawalRequestLoading,
- error,
- refetch
- } = useGetFawateerForMakerRequestQuery(
- {
- page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
- size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
- searchTerm: debouncedSearchTerm,
- },
- {
- skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
- }
- );
-
- console.log(data);
+const ApproveHistoryMaker = () => {
+ const toast = useToast();
+ const { slideFromRight, approveHistory, setApproveHistory } =
+ useContext(GlobalStateContext);
+ const [searchTerm, setSearchTerm] = useState("");
+ const [isLoading, setIsLoading] = useState(true);
+ const [deleteAlert, setDeleteAlert] = useState(false);
+ const [actionId, setActionId] = useState(false);
+ const [mouseEntered, setMouseEntered] = useState(false);
+ const [mouseEnteredId, setMouseEnteredId] = useState("");
+ const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
- useEffect(() => {
- const handler = setTimeout(() => {
- setDebouncedSearchTerm(searchTerm);
- }, 500); // Adjust delay as needed
- return () => {
- clearTimeout(handler);
- };
- }, [searchTerm]);
-
- // Use useEffect to refetch data when the component mounts
- useEffect(() => {
- refetch();
- }, [refetch]);
-
- useEffect(() => {
- // Simulate loading
- const timer = setTimeout(() => {
- setIsLoading(false);
- }, 1500);
-
- // Cleanup the timer on component unmount
- return () => clearTimeout(timer);
- }, []);
-
- // ====================================================[Table Filter]================================================================
- const filteredData = data?.data?.rows?.filter((item) => {
- // Filter by name (case insensitive)
- const name = item.firstName;
- const searchLower = searchTerm.toLowerCase();
- const nameMatches = name.toLowerCase().includes(searchLower);
-
- // Filter by status
- // const status = item.status;
- // const statusLower = status ? "active" : "inactive";
-
- // const statusMatches =
- // statusFilter === "all" ||
- // (statusFilter === "active" && status === true) ||
- // (statusFilter === "inactive" && status === false);
-
- return nameMatches;
+ const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
+ const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
+
+ const [createFawateerReversalRequest] =
+ useCreateFawateerReversalRequestMutation();
+
+ const [reversalId, setReversalId] = useState();
+ const {
+ isOpen: isOpenInRev,
+ onOpen: onOpenInRev,
+ onClose: onCloseInRev,
+ } = useDisclosure();
+ const [isReversalLoading, setIsReversalLoading] = useBoolean();
+
+ const formatDate = (date) => {
+ return new Date(date).toLocaleDateString("en-GB", {
+ day: "2-digit",
+ month: "2-digit",
+ year: "numeric",
});
-
- // ====================================================[Table Setup]================================================================
- const tableHeadRow = [
- "Sr.no",
- "Client ID",
- "First Name",
- "Last Name",
- "E-mail ID",
- "Phone Number",
- "Deposit Date",
- "Deposit Amount (BHD)",
- "Support Image",
- "Status",
- "Reversal",
- ];
-
- const extractedArray = data?.data?.rows?.map((item, idx) => ({
-
- // id: item?.id,
- "Sr.no": (
-
- {generateSerialNumber(idx, currentPage, pageSize)}
+ };
+
+ const {
+ isOpen: isConfirmOpen,
+ onOpen: onConfirmOpen,
+ onClose: onConfirmClose,
+ } = useDisclosure();
+ const {
+ isOpen: isRejectOpen,
+ onOpen: onRejectOpen,
+ onClose: onRejectClose,
+ } = useDisclosure();
+
+ const {
+ data,
+ isLoading: drawalRequestLoading,
+ error,
+ refetch,
+ } = useGetFawateerForMakerRequestQuery(
+ {
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+ searchTerm: debouncedSearchTerm,
+ },
+ {
+ skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
+ }
+ );
+
+ useEffect(() => {
+ const handler = setTimeout(() => {
+ setDebouncedSearchTerm(searchTerm);
+ }, 500); // Adjust delay as needed
+ return () => {
+ clearTimeout(handler);
+ };
+ }, [searchTerm]);
+
+ // Use useEffect to refetch data when the component mounts
+ useEffect(() => {
+ refetch();
+ }, [refetch]);
+
+ useEffect(() => {
+ // Simulate loading
+ const timer = setTimeout(() => {
+ setIsLoading(false);
+ }, 1500);
+
+ // Cleanup the timer on component unmount
+ return () => clearTimeout(timer);
+ }, []);
+
+ // ====================================================[Table Filter]================================================================
+ const filteredData = data?.data?.rows?.filter((item) => {
+ // Filter by name (case insensitive)
+ const name = item.firstName;
+ const searchLower = searchTerm.toLowerCase();
+ const nameMatches = name.toLowerCase().includes(searchLower);
+
+ // Filter by status
+ // const status = item.status;
+ // const statusLower = status ? "active" : "inactive";
+
+ // const statusMatches =
+ // statusFilter === "all" ||
+ // (statusFilter === "active" && status === true) ||
+ // (statusFilter === "inactive" && status === false);
+
+ return nameMatches;
+ });
+
+ // ====================================================[Table Setup]================================================================
+ const tableHeadRow = [
+ "Sr.no",
+ "Client ID",
+ "First Name",
+ "Last Name",
+ "E-mail ID",
+ "Phone Number",
+ "Deposit Date",
+ "Deposit Amount (BHD)",
+ "Support Image",
+ "Status",
+ isMaker() && "Reversal Action",
+ ];
+
+ const extractedArray = data?.data?.rows?.map((item, idx) => ({
+ // id: item?.id,
+ "Sr.no": (
+
+ {generateSerialNumber(idx, currentPage, pageSize)}
+
+ ),
+ "Client ID": (
+
+ {item.clientReference_id}
+
+ ),
+ "First Name": (
+
+
+ {item.firstName}
- ),
- "Client ID": (
-
- {item.clientReference_id}
+
+ ),
+ "Last Name": (
+
+
+ {item.lastName}
- ),
- "First Name": (
-
-
- {item.firstName}
-
-
- ),
- "Last Name": (
-
-
- {item.lastName}
-
-
- ),
- "E-mail ID": (
-
-
- {item.emailAddress}
-
-
- ),
- "Phone Number": (
-
-
- {item.mobileNumber}
-
-
- ),
- "Deposit Date": (
-
-
- {formatDate(item?.transaction_date)}
-
-
- ),
- "Deposit Amount (BHD)": (
-
-
- {/* {item.investorAmount} */}
- {parseFloat(item?.transaction_amount || 0).toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- {/* {item?.transaction_amount} */}
-
-
- ),
- "Support Image": (
-
- {item?.spportFile_path&&
+ ),
+ "E-mail ID": (
+
+
+ {item.emailAddress}
+
+
+ ),
+ "Phone Number": (
+
+
+ {item.mobileNumber}
+
+
+ ),
+ "Deposit Date": (
+
+
+ {formatDate(item?.transaction_date)}
+
+
+ ),
+ "Deposit Amount (BHD)": (
+
+
+ {/* {item.investorAmount} */}
+ {parseFloat(item?.transaction_amount || 0).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}
+ {/* {item?.transaction_amount} */}
+
+
+ ),
+ "Support Image": (
+
+ {item?.spportFile_path && (
+
-
+
View
- }
-
- ),
- Status: (
-
-
+ )}
+
+ ),
+ Status: (
+
+
- {item.transactionStatus}
-
-
- ),
- "Reversal": (
-
-
- {item?.reversal === true ? "Initiate Reversal" : "Under Process"}
-
-
- ),
- }));
-
- const handleDelete = () => {
- const updatedSponsors = sponser.filter(
- (sponsor) => sponsor.id !== actionId
- );
-
- setTimeout(() => {
- setSponser(updatedSponsors);
- setDeleteAlert(false);
- setIsLoading(false);
- }, 100);
- setIsLoading(true);
- };
-
- return (
-
-
-
- setSearchTerm(e.target.value)}
- />
-
-
-
-
-
-
-
- setDeleteAlert(false)}
- isOpen={deleteAlert}
- message={"Are you sure you want to delete sponers?"}
- alertHandler={handleDelete}
- isLoading={isLoading}
- />
-
-
+ }
+ >
+ {item.transactionStatus}
+
+ ),
+ "Reversal Action": (
+
+ {item.transactionStatus === "Approved" ? (
+
+ {!item.isReversal ? (
+
+ ) : (
+ "Under process"
+ )}
+
+ ) : (
+ ""
+ )}
+
+ ),
+ }));
+
+ const handleDelete = () => {
+ const updatedSponsors = sponser.filter(
+ (sponsor) => sponsor.id !== actionId
);
+
+ setTimeout(() => {
+ setSponser(updatedSponsors);
+ setDeleteAlert(false);
+ setIsLoading(false);
+ }, 100);
+ setIsLoading(true);
};
-
- export default ApproveHistoryMaker;
-
\ No newline at end of file
+
+ const handleApproved = async (data) => {
+ setIsReversalLoading.on(); // Start loading
+ try {
+ const { error, data: responseData } = await createFawateerReversalRequest(
+ {
+ id: reversalId,
+ data,
+ }
+ );
+
+ if (error) {
+ throw error; // Explicitly handle the error
+ }
+
+ // Success: Perform necessary actions
+ refetch();
+ toast({
+ render: () => (
+
+ ),
+ });
+ onCloseInRev();
+ } catch (error) {
+ // Handle errors
+ toast({
+ render: () => (
+
+ ),
+ });
+ console.error("Error:", error);
+ } finally {
+ setIsReversalLoading.off(); // Ensure loading is toggled off
+ }
+ };
+
+ return (
+
+
+
+ setSearchTerm(e.target.value)}
+ />
+
+
+
+
+
+
+
+ setDeleteAlert(false)}
+ isOpen={deleteAlert}
+ message={"Are you sure you want to delete sponers?"}
+ alertHandler={handleDelete}
+ isLoading={isLoading}
+ />
+
+
+
+
+
+ );
+};
+
+export default ApproveHistoryMaker;
diff --git a/src/Services/reversal.fawateer.deposit.service.js b/src/Services/reversal.fawateer.deposit.service.js
index 6b25bfd..252ba66 100644
--- a/src/Services/reversal.fawateer.deposit.service.js
+++ b/src/Services/reversal.fawateer.deposit.service.js
@@ -1,12 +1,12 @@
// Need to use the React-specific entry point to import createApi
-import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
+import { createApi } 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"],
+ tagTypes: ["getFawateerDeposit", 'getDepositHistory'],
endpoints: (builder) => ({
// ======[Get All]=====
@@ -14,9 +14,39 @@ export const reversalFawateerDepositMaster = createApi({
query: () => `/reversal-transactions/bank-transfer/getAll`,
providesTags: ["getFawateerDeposit"],
}),
- }),
+
+ approveFawateerRequest: builder.mutation({
+ query: ({ id, data }) => ({
+ url: `/reversal-transactions/fawateer/approve/${id}`,
+ method: "PATCH",
+ body: data,
+ }),
+ invalidatesTags: ["getFawateerDeposit", "getDepositHistory"],
+ }),
+
+ createFawateerReversalRequest: builder.mutation({
+ query: ({ id, data }) => ({
+ url: `/reversal-transactions/fawateer/create/${id}`,
+ method: "POST",
+ body: data,
+ }),
+ invalidatesTags: ["getFawateerDeposit", "getDepositHistory"],
+ }),
+
+ rejectFawateerRequest: builder.mutation({
+ query: ({ id, data }) => ({
+ url: `/reversal-transactions/bank-transfer/reject/${id}`,
+ method: "PATCH",
+ body: data,
+ }),
+ invalidatesTags: ["getFawateerDeposit", "getDepositHistory"],
+ }),
+ })
});
-export const {
- useGetFawateerDepositMasterQuery,
- } = reversalFawateerDepositMaster;
+export const {
+ useGetFawateerDepositMasterQuery,
+ useApproveFawateerRequestMutation,
+ useCreateFawateerReversalRequestMutation,
+ useRejectFawateerRequestMutation,
+} = reversalFawateerDepositMaster;
From cbfeff4710ef15c95356575db0ab7c7ee32f9d54 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Fri, 17 Jan 2025 16:02:01 +0530
Subject: [PATCH 22/50] [ Update table fawateer deposite ]
---
.../Popups/RejectReversalPopups.jsx | 124 ++++++++++++++++++
.../Investor/UnbanInvestor/ReasonBanModal.jsx | 2 +-
.../BankDepositRequest/BankDepositRequest.jsx | 55 +++++++-
src/Pages/BankDepositRequest/RejectModal.jsx | 107 ++++++++++-----
.../DepositRequest/DepositRequestReject.jsx | 2 +-
.../ReversalFawateerDeposit.jsx | 28 ++--
.../reversal.fawateer.deposit.service.js | 8 +-
7 files changed, 267 insertions(+), 59 deletions(-)
create mode 100644 src/Components/Popups/RejectReversalPopups.jsx
diff --git a/src/Components/Popups/RejectReversalPopups.jsx b/src/Components/Popups/RejectReversalPopups.jsx
new file mode 100644
index 0000000..8fc8bf8
--- /dev/null
+++ b/src/Components/Popups/RejectReversalPopups.jsx
@@ -0,0 +1,124 @@
+import {
+ Box,
+ Button,
+ FormControl,
+ FormLabel,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Text,
+ Textarea,
+} from "@chakra-ui/react";
+import React from "react";
+import PropTypes from "prop-types";
+
+import * as yup from "yup";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { useForm } from "react-hook-form";
+
+export const conformModalSchema = yup.object().shape({
+ comments: yup
+ .string()
+ .min(2, "Minimum length should be 150 characters.")
+ .max(150, "Maximum length should be 150 characters.")
+ .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
+ .required("Comment is required"),
+});
+
+const RejectReversalPopups = ({
+ isOpen,
+ onClose,
+ handelApproved,
+ isLoading,
+}) => {
+ const {
+ watch,
+ register,
+ reset,
+ handleSubmit,
+ formState: { errors },
+ } = useForm({
+ resolver: yupResolver(conformModalSchema),
+ mode: "all",
+ });
+
+ return (
+
+
+
+ Reject
+
+ {
+ handelApproved(data);
+ reset();
+ onClose();
+ })}
+ >
+
+
+ Comment
+
+ {errors.comments ? (
+
+ {errors.comments.message}
+
+ ) : (
+
+ Maximum length should be 150 characters. You have entered{" "}
+ {watch()?.comments?.length || 0} characters.
+
+ )}
+
+
+
+
+
+
+
+
+
+ );
+};
+
+RejectReversalPopups.propTypes = {
+ isOpen: PropTypes.bool.isRequired,
+ onClose: PropTypes.func.isRequired,
+ handelApproved: PropTypes.func.isRequired,
+ isLoading: PropTypes.func.isRequired,
+};
+
+export default RejectReversalPopups;
diff --git a/src/Pages/Admin/Investor/UnbanInvestor/ReasonBanModal.jsx b/src/Pages/Admin/Investor/UnbanInvestor/ReasonBanModal.jsx
index 3e7d9d2..6acb4a1 100644
--- a/src/Pages/Admin/Investor/UnbanInvestor/ReasonBanModal.jsx
+++ b/src/Pages/Admin/Investor/UnbanInvestor/ReasonBanModal.jsx
@@ -34,7 +34,7 @@ import { useUpdateBanMutation, useUpdateUnbanMutation } from "../../../../Servic
const toast = useToast()
const {
- register,
+ register,
reset,
handleSubmit,
formState: { errors },
diff --git a/src/Pages/BankDepositRequest/BankDepositRequest.jsx b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
index 00524f4..8cd0986 100644
--- a/src/Pages/BankDepositRequest/BankDepositRequest.jsx
+++ b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
@@ -10,6 +10,7 @@ import {
useToast,
useDisclosure,
Link,
+ useBoolean,
} from "@chakra-ui/react";
import React, { useContext, useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";
@@ -27,7 +28,11 @@ 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";
+import {
+ useGetBankDepositMasterQuery,
+ useRejectbankDepositRequestMutation,
+} from "../../Services/bankdeposit.request.service";
+import RejectReversalPopups from "../../Components/Popups/RejectReversalPopups";
const formatDate = (date) => {
return new Date(date).toLocaleDateString("en-GB", {
@@ -64,6 +69,9 @@ const BankDepositRequest = () => {
const [searchTerm, setSearchTerm] = useState("");
const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
+ const [rejectbankDepositRequest] = useRejectbankDepositRequestMutation();
+ const [isReversalLoading, setIsReversalLoading] = useBoolean();
+
// Debounce the search term to avoid making a request on every keystroke
useEffect(() => {
const handler = setTimeout(() => {
@@ -283,10 +291,53 @@ const BankDepositRequest = () => {
setIsLoading(true);
};
+ const handleApproved = async (data) => {
+ setIsReversalLoading.on(); // Start loading
+ try {
+ const { error, data: responseData } = await rejectbankDepositRequest({
+ id: actionId,
+ data,
+ });
+
+ if (error) {
+ throw error; // Explicitly handle the error
+ }
+
+ // Success: Perform necessary actions
+ refetch();
+ toast({
+ render: () => (
+
+ ),
+ });
+ onRejectClose();
+ } catch (error) {
+ // Handle errors
+ toast({
+ render: () => (
+
+ ),
+ });
+ console.error("Error:", error);
+ } finally {
+ setIsReversalLoading.off(); // Ensure loading is toggled off
+ }
+ };
+
return (
-
+
{
+const RejectModal = ({ isOpen, onClose, firstField ,id}) => {
+ const [isBtnLoading , setIsBtnLoading] = useState(false)
+
+ const toast = useToast()
+
const {
- register,
+ register,
+ reset,
handleSubmit,
formState: { errors },
} = useForm({
resolver: yupResolver(conformModalSchema),
});
- const onSubmit = (data) => {
- setFile(data.document[0]);
+ const [ rejectbankDepositRequest ] = useRejectbankDepositRequestMutation()
- const newDocument = {
- ...data,
- document: data.document[0].name, // Store the document name
- comment: true,
- id: uuidv4(),
- Type: getFileIcon(file.type),
- };
+ const onSubmit = async(data) => {
+ console.log(id);
+ setIsBtnLoading(true)
+ try {
+ const res = await rejectbankDepositRequest({ id ,data})
+ console.log(res);
+
+ if (res?.error) {
+ toast({
+ render: () => (
+
+ ),
+ });
+ heandleOnClose()
+
+ }else if(res?.data) {
+ toast({
+ render: () => (
+
+ ),
+ });
+ heandleOnClose()
+ }
+
+ } catch (error) {
+ console.log(error);
+
+ }
- setCreate((prevCreate) => [...prevCreate, newDocument]);
- onClose();
- };
-
- const handleFileChange = (event) => {
- const selectedFile = event.target.files[0];
- setFile(selectedFile);
};
+
+ const heandleOnClose = () =>{
+ reset()
+ onClose()
+ setIsBtnLoading(false)
+ }
+
return (
-
+
Reject
@@ -63,29 +89,44 @@ const RejectModal = ({ isOpen, onClose, firstField }) => {
Comment
-
- {errors.comment && (
+ {errors.comments && (
- {errors.comment.message}
+ {errors.comments.message}
)}
-
diff --git a/src/Pages/Deposit/DepositRequest/DepositRequestReject.jsx b/src/Pages/Deposit/DepositRequest/DepositRequestReject.jsx
index 8aead10..8a8ea29 100644
--- a/src/Pages/Deposit/DepositRequest/DepositRequestReject.jsx
+++ b/src/Pages/Deposit/DepositRequest/DepositRequestReject.jsx
@@ -110,7 +110,7 @@ const DepositRequestReject = ({ isOpen, onClose, firstField ,id}) => {
Investor Comment
{isLoading ? (
-
+
) : (
diff --git a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
index bf1376e..43bfc99 100644
--- a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
+++ b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
@@ -61,7 +61,7 @@ import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawate
onClose: onRejectClose,
} = useDisclosure();
- const {
+ const {
data,
isLoading: drawalRequestLoading,
error,
@@ -77,7 +77,7 @@ import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawate
}
);
- console.log(data);
+ console.log("ffffffffffffffffffffff",data?.data?.rows);
useEffect(() => {
const handler = setTimeout(() => {
@@ -104,9 +104,9 @@ import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawate
}, []);
// ====================================================[Table Filter]================================================================
- const filteredData = data?.data?.rows?.filter((item) => {
+ const filteredData =data?.data?.rows?.filter((item) => {
// Filter by name (case insensitive)
- const name = item.firstName;
+ const name = item.principal?.firstName;
const searchLower = searchTerm.toLowerCase();
const nameMatches = name.toLowerCase().includes(searchLower);
@@ -130,7 +130,6 @@ import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawate
"First Name",
"Last Name",
"Phone Number",
- "Country",
"Action",
];
@@ -158,7 +157,7 @@ import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawate
fontWeight={"500"}
className="d-flex align-items-center web-text-small"
>
- {formatDate(item?.createdAt)}
+ {formatDate(item?.transaction_details?.isReversalDate)}
),
"Client ID": (
@@ -170,34 +169,27 @@ import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawate
fontWeight={"500"}
className="d-flex align-items-center web-text-small"
>
- {item.clientReference_id}
+ {item?.principal?.investor_details?.clientReference_id}
),
"First Name": (
- {item.firstName}
+ {item?.principal?.firstName}
),
"Last Name": (
-
+
- {item.lastName}
-
-
- ),
- "Country": (
-
-
- {item.lastName}
+ {item?.principal?.lastName}
),
"Phone Number": (
- {item.mobileNumber}
+ {item?.principal?.mobileNumber}
),
diff --git a/src/Services/reversal.fawateer.deposit.service.js b/src/Services/reversal.fawateer.deposit.service.js
index 252ba66..0d74222 100644
--- a/src/Services/reversal.fawateer.deposit.service.js
+++ b/src/Services/reversal.fawateer.deposit.service.js
@@ -6,12 +6,12 @@ import { baseQuery } from "./token.serivce";
export const reversalFawateerDepositMaster = createApi({
reducerPath: "FawateerDeposit",
baseQuery: baseQuery,
- tagTypes: ["getFawateerDeposit", 'getDepositHistory'],
+ tagTypes: ["getFawateerDeposit", "getDepositHistory"],
endpoints: (builder) => ({
// ======[Get All]=====
getFawateerDepositMaster: builder.query({
- query: () => `/reversal-transactions/bank-transfer/getAll`,
+ query: () => `/reversal-transactions/fawateer/getAll`,
providesTags: ["getFawateerDeposit"],
}),
@@ -35,13 +35,13 @@ export const reversalFawateerDepositMaster = createApi({
rejectFawateerRequest: builder.mutation({
query: ({ id, data }) => ({
- url: `/reversal-transactions/bank-transfer/reject/${id}`,
+ url: `/reversal-transactions/fawateer/reject/${id}`,
method: "PATCH",
body: data,
}),
invalidatesTags: ["getFawateerDeposit", "getDepositHistory"],
}),
- })
+ }),
});
export const {
From ba06bf28c00faf4139a5c1ee81c1ee285bfa1917 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Fri, 17 Jan 2025 16:19:35 +0530
Subject: [PATCH 23/50] Add account deletion reversal functionality and update
DeletionHistory component
---
src/Pages/AccountDeletion/DeletionHistory.jsx | 171 +++++++++++++-----
.../reversal.account.deletion.service.js | 38 +++-
2 files changed, 162 insertions(+), 47 deletions(-)
diff --git a/src/Pages/AccountDeletion/DeletionHistory.jsx b/src/Pages/AccountDeletion/DeletionHistory.jsx
index 1108499..48c5c01 100644
--- a/src/Pages/AccountDeletion/DeletionHistory.jsx
+++ b/src/Pages/AccountDeletion/DeletionHistory.jsx
@@ -7,6 +7,8 @@ import {
Input,
Text,
Tooltip,
+ useBoolean,
+ useDisclosure,
useToast,
} from "@chakra-ui/react";
import React, { useContext, useEffect, useState } from "react";
@@ -19,25 +21,36 @@ import { formatDate } from "../../Components/Functions/UTCConvertor";
import { CheckIcon, CloseIcon } from "@chakra-ui/icons";
import { useGetDeleteHistoryQuery } from "../../Services/delete.request.service";
import { TABLE_PAGINATION } from "../../Constants/Paginations";
+import InitiateReversalPopup from "../../Components/Popups/InitiateReversalPopups";
+import ToastBox from "../../Components/ToastBox";
+import { useCreateAccountDeletionReversalRequestMutation } from "../../Services/reversal.account.deletion.service";
// import { formatDate } from "../../Components/Functions/UTCConvertor";
const DeletionHistory = () => {
const toast = useToast();
- const { slideFromRight, setDeleteHistory } =
- useContext(GlobalStateContext);
+ const { slideFromRight, setDeleteHistory } = useContext(GlobalStateContext);
const [deleteAlert, setDeleteAlert] = useState(false);
const [actionId, setActionId] = useState(false);
const [mouseEntered, setMouseEntered] = useState(false);
const [mouseEnteredId, setMouseEnteredId] = useState("");
-
-
- // =========================== [Use State] =============================
+ // =========================== [Use State] =============================
const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
const [searchTerm, setSearchTerm] = useState("");
const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
+ const [reversalId, setReversalId] = useState();
+ const {
+ isOpen: isOpenInRev,
+ onOpen: onOpenInRev,
+ onClose: onCloseInRev,
+ } = useDisclosure();
+ const [isReversalLoading, setIsReversalLoading] = useBoolean();
+
+ const [createAccountDeletionReversalRequest] =
+ useCreateAccountDeletionReversalRequestMutation();
+
// Debounce the search term to avoid making a request on every keystroke
useEffect(() => {
const handler = setTimeout(() => {
@@ -48,33 +61,33 @@ const DeletionHistory = () => {
};
}, [searchTerm]);
-
const {
data: deleteHistory,
isLoading,
- refetch
- } = useGetDeleteHistoryQuery({
- page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
- size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
- search: debouncedSearchTerm,
- },
- {
- skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
- })
+ refetch,
+ } = useGetDeleteHistoryQuery(
+ {
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+ search: debouncedSearchTerm,
+ },
+ {
+ skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
+ }
+ );
const formatDate = (date) => {
- return new Date(date).toLocaleDateString('en-GB', {
- day: '2-digit',
- month: '2-digit',
- year: 'numeric',
+ return new Date(date).toLocaleDateString("en-GB", {
+ day: "2-digit",
+ month: "2-digit",
+ year: "numeric",
});
};
- // Use useEffect to refetch data when the component mounts
- useEffect(() => {
- refetch();
-}, [refetch]);
-
+ // Use useEffect to refetch data when the component mounts
+ useEffect(() => {
+ refetch();
+ }, [refetch]);
// ====================================================[Table Setup]================================================================
const tableHeadRow = [
@@ -85,7 +98,8 @@ const DeletionHistory = () => {
"Last Name",
"Country",
"Phone Number",
- "Status"
+ "Status",
+ "Reversal Action",
];
const extractedArray = deleteHistory?.data?.rows?.map((item, index) => ({
@@ -96,7 +110,7 @@ const DeletionHistory = () => {
as={"span"}
color={"gray.800"}
className="d-flex align-items-center web-text-small"
- fontWeight={'500'}
+ fontWeight={"500"}
>
{index + 1}.
@@ -107,7 +121,7 @@ const DeletionHistory = () => {
as={"span"}
color={"gray.600"}
className="d-flex align-items-center web-text-small"
- fontWeight={'500'}
+ fontWeight={"500"}
>
{formatDate(item.Requested_on)}
@@ -118,7 +132,7 @@ const DeletionHistory = () => {
as={"span"}
color={"gray.600"}
className="d-flex align-items-center web-text-small"
- fontWeight={'500'}
+ fontWeight={"500"}
>
{item.clientId}
@@ -129,7 +143,7 @@ const DeletionHistory = () => {
as={"span"}
color={"gray.800"}
className="d-flex align-items-center web-text-small"
- fontWeight={'500'}
+ fontWeight={"500"}
>
{item.firstName}
{/* {formatDate(item.charge)} */}
@@ -141,51 +155,77 @@ const DeletionHistory = () => {
as={"span"}
color={"gray.800"}
className="d-flex align-items-center web-text-small"
- fontWeight={'500'}
+ fontWeight={"500"}
>
{item.lastName}
),
- "Country": (
-
{item.country}
),
"Phone Number": (
-
{item.phoneNumber}
),
- "Status": (
-
{item.deletionStatus}
),
+ "Reversal Action": (
+
+ {item.deletionStatus === "Approved" ? (
+
+ {!item.isReversal ? (
+ {
+ onOpenInRev(); // Call the function
+ setReversalId(item.id);
+ }}
+ colorScheme="teal"
+ size="xs"
+ variant="outline"
+ >
+ Initiate Reversal
+
+ ) : (
+ "Under process"
+ )}
+
+ ) : (
+ ""
+ )}
+
+ ),
}));
const handleDelete = () => {
- const deleteHistory = sponser.filter(
- (sponsor) => sponsor.id !== actionId
- );
+ const deleteHistory = sponser.filter((sponsor) => sponsor.id !== actionId);
setTimeout(() => {
setSponser(deleteHistory);
@@ -195,6 +235,45 @@ const DeletionHistory = () => {
setIsLoading(true);
};
+ const handleApproved = async (data) => {
+ setIsReversalLoading.on(); // Start loading
+ try {
+ const { error, data: responseData } =
+ await createAccountDeletionReversalRequest({
+ id: reversalId,
+ data,
+ });
+
+ if (error) {
+ throw error; // Explicitly handle the error
+ }
+
+ // Success: Perform necessary actions
+ refetch();
+ toast({
+ render: () => (
+
+ ),
+ });
+ onCloseInRev();
+ } catch (error) {
+ // Handle errors
+ toast({
+ render: () => (
+
+ ),
+ });
+ console.error("Error:", error);
+ } finally {
+ setIsReversalLoading.off(); // Ensure loading is toggled off
+ }
+ };
+
return (
@@ -244,6 +323,12 @@ const DeletionHistory = () => {
alertHandler={handleDelete}
isLoading={isLoading}
/>
+
);
};
diff --git a/src/Services/reversal.account.deletion.service.js b/src/Services/reversal.account.deletion.service.js
index 068150e..66100d0 100644
--- a/src/Services/reversal.account.deletion.service.js
+++ b/src/Services/reversal.account.deletion.service.js
@@ -6,7 +6,7 @@ import { baseQuery } from "./token.serivce";
export const reversalAccountDeletionMaster = createApi({
reducerPath: "accountDeletion",
baseQuery: baseQuery,
- tagTypes: ["getAccountDeletion"],
+ tagTypes: ["getAccountDeletion", "getHistory"],
endpoints: (builder) => ({
// ======[Get All]=====
@@ -14,9 +14,39 @@ export const reversalAccountDeletionMaster = createApi({
query: () => `/reversal-transactions/account-deletion/getAll`,
providesTags: ["getAccountDeletion"],
}),
+
+ approveAccountDeletionRequest: builder.mutation({
+ query: ({ id, data }) => ({
+ url: `/reversal-transactions/account-deletion/approve/${id}`,
+ method: "PATCH",
+ body: data,
+ }),
+ invalidatesTags: ["getAccountDeletion", "getHistory"],
+ }),
+
+ createAccountDeletionReversalRequest: builder.mutation({
+ query: ({ id, data }) => ({
+ url: `/reversal-transactions/account-deletion/create/${id}`,
+ method: "POST",
+ body: data,
+ }),
+ invalidatesTags: ["getAccountDeletion", "getHistory"],
+ }),
+
+ rejectAccountDeletionRequest: builder.mutation({
+ query: ({ id, data }) => ({
+ url: `/reversal-transactions/account-deletion/reject/${id}`,
+ method: "PATCH",
+ body: data,
+ }),
+ invalidatesTags: ["getAccountDeletion", "getHistory"],
+ }),
}),
});
-export const {
- useGetAccountDeletionMasterQuery,
- } = reversalAccountDeletionMaster;
+export const {
+ useGetAccountDeletionMasterQuery,
+ useCreateAccountDeletionReversalRequestMutation,
+ useApproveAccountDeletionRequestMutation,
+ useRejectAccountDeletionRequestMutation
+} = reversalAccountDeletionMaster;
From 27b7e319301475f0867aa4385ba13ec8f7c420f5 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Fri, 17 Jan 2025 16:22:01 +0530
Subject: [PATCH 24/50] Conditionally display "Reversal Action" column in
DeletionHistory based on user role
---
src/Pages/AccountDeletion/DeletionHistory.jsx | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/Pages/AccountDeletion/DeletionHistory.jsx b/src/Pages/AccountDeletion/DeletionHistory.jsx
index 48c5c01..de621a3 100644
--- a/src/Pages/AccountDeletion/DeletionHistory.jsx
+++ b/src/Pages/AccountDeletion/DeletionHistory.jsx
@@ -24,6 +24,7 @@ import { TABLE_PAGINATION } from "../../Constants/Paginations";
import InitiateReversalPopup from "../../Components/Popups/InitiateReversalPopups";
import ToastBox from "../../Components/ToastBox";
import { useCreateAccountDeletionReversalRequestMutation } from "../../Services/reversal.account.deletion.service";
+import { isMaker } from "../../Constants/Constants";
// import { formatDate } from "../../Components/Functions/UTCConvertor";
const DeletionHistory = () => {
@@ -99,7 +100,7 @@ const DeletionHistory = () => {
"Country",
"Phone Number",
"Status",
- "Reversal Action",
+ isMaker() && "Reversal Action",
];
const extractedArray = deleteHistory?.data?.rows?.map((item, index) => ({
From ccd27b784068ecdab0b1bfe2ebbe3932bd06860f Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Fri, 17 Jan 2025 16:34:46 +0530
Subject: [PATCH 25/50] [update]- fawateerdeposite
---
.../Popups/RejectReversalPopups.jsx | 1 +
.../BankDepositRequest/BankDepositRequest.jsx | 9 ++-
.../ReversalFawateerDeposit.jsx | 62 ++++++++++++++-----
3 files changed, 57 insertions(+), 15 deletions(-)
diff --git a/src/Components/Popups/RejectReversalPopups.jsx b/src/Components/Popups/RejectReversalPopups.jsx
index 8fc8bf8..4bff86e 100644
--- a/src/Components/Popups/RejectReversalPopups.jsx
+++ b/src/Components/Popups/RejectReversalPopups.jsx
@@ -74,6 +74,7 @@ const RejectReversalPopups = ({
placeholder={"Enter your comments...."}
rounded={"md"}
resize={"none"}
+ mb={2}
/>
{errors.comments ? (
diff --git a/src/Pages/BankDepositRequest/BankDepositRequest.jsx b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
index 8cd0986..259dd61 100644
--- a/src/Pages/BankDepositRequest/BankDepositRequest.jsx
+++ b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
@@ -33,6 +33,7 @@ import {
useRejectbankDepositRequestMutation,
} from "../../Services/bankdeposit.request.service";
import RejectReversalPopups from "../../Components/Popups/RejectReversalPopups";
+import ConfirmReversalPopups from "../../Components/Popups/ConfirmReversalPopups";
const formatDate = (date) => {
return new Date(date).toLocaleDateString("en-GB", {
@@ -331,8 +332,14 @@ const BankDepositRequest = () => {
return (
-
+ {/* */}
+ {
const toast = useToast();
@@ -38,7 +39,10 @@ import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawate
const [mouseEntered, setMouseEntered] = useState(false);
const [mouseEnteredId, setMouseEnteredId] = useState("");
const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
+ const [isReversalLoading, setIsReversalLoading] = useBoolean();
+ const [rejectFawateerRequest] = useRejectFawateerRequestMutation();
+
const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
@@ -110,15 +114,6 @@ import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawate
const searchLower = searchTerm.toLowerCase();
const nameMatches = name.toLowerCase().includes(searchLower);
- // Filter by status
- // const status = item.status;
- // const statusLower = status ? "active" : "inactive";
-
- // const statusMatches =
- // statusFilter === "all" ||
- // (statusFilter === "active" && status === true) ||
- // (statusFilter === "inactive" && status === false);
-
return nameMatches;
});
@@ -263,6 +258,44 @@ import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawate
}, 100);
setIsLoading(true);
};
+
+ const handleApproved = async (data) => {
+ setIsReversalLoading.on(); // Start loading
+ try {
+ const { error, data: responseData } = await rejectFawateerRequest({
+ id: actionId,
+ data,
+ });
+
+ if (error) {
+ throw error; // Explicitly handle the error
+ }
+
+ // Success: Perform necessary actions
+ refetch();
+ toast({
+ render: () => (
+
+ ),
+ });
+ onRejectClose();
+ } catch (error) {
+ // Handle errors
+ toast({
+ render: () => (
+
+ ),
+ });
+ console.error("Error:", error);
+ } finally {
+ setIsReversalLoading.off(); // Ensure loading is toggled off
+ }
+ };
return (
@@ -325,10 +358,11 @@ import { useGetFawateerDepositMasterQuery } from "../../Services/reversal.fawate
id={actionId}
// firstField={firstField}
/>
-
);
From 7e8f5e11158dc44ab08e0dd5cd95fc61fd751900 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Fri, 17 Jan 2025 17:01:49 +0530
Subject: [PATCH 26/50] =?UTF-8?q?[=20=20kaam=20chalu=20hai=F0=9F=91=B7?=
=?UTF-8?q?=E2=80=8D=E2=99=82=EF=B8=8F=20=20]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Popups/ConfirmReversalPopups.jsx | 183 ++++++++++++++++++
.../BankDepositRequest/BankDepositRequest.jsx | 49 ++++-
.../ReversalFawateerDeposit.jsx | 12 +-
3 files changed, 234 insertions(+), 10 deletions(-)
create mode 100644 src/Components/Popups/ConfirmReversalPopups.jsx
diff --git a/src/Components/Popups/ConfirmReversalPopups.jsx b/src/Components/Popups/ConfirmReversalPopups.jsx
new file mode 100644
index 0000000..b97551c
--- /dev/null
+++ b/src/Components/Popups/ConfirmReversalPopups.jsx
@@ -0,0 +1,183 @@
+import {
+ Box,
+ Button,
+ Checkbox,
+ FormControl,
+ FormLabel,
+ Input,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Text,
+ Textarea,
+} from "@chakra-ui/react";
+import React, { useState } from "react";
+import PropTypes from "prop-types";
+
+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({
+ comments: yup
+ .string()
+ .min(2, "Minimum length should be 150 characters.")
+ .max(150, "Maximum length should be 150 characters.")
+ .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
+ .required("Comment is required"),
+});
+
+const ConfirmReversalPopups = ({
+ isOpen,
+ onClose,
+ handleConfirm,
+ isLoading,
+}) => {
+ const {
+ watch,
+ register,
+ reset,
+ handleSubmit,
+ formState: { errors },
+ } = useForm({
+ resolver: yupResolver(conformModalSchema),
+ mode: "all",
+ });
+
+ const [emailApproval, setEmailApproval] = useState(false);
+
+
+ const modules = {
+ toolbar: [
+ // [{ header: "1" }, { header: "2" },
+ // // { font: [] }
+ // ],
+ // [{ size: [] }],
+ ["bold", "italic", "underline", "strike", "blockquote"],
+ [{ list: "ordered" }, { list: "bullet" }],
+ ["clean"],
+ ],
+ };
+
+ return (
+
+
+
+ Approve
+
+ {
+ handleConfirm(data);
+ reset();
+ onClose();
+ })}
+ >
+
+
+ Comment
+
+ {errors.comments ? (
+
+ {errors.comments.message}
+
+ ) : (
+
+ Maximum length should be 150 characters. You have entered{" "}
+ {watch()?.comments?.length || 0} characters.
+
+ )}
+
+ setEmailApproval(e.target.checked)}
+ >
+
+ Send an email to the user upon approval
+
+
+ {emailApproval && (
+
+
+
+ Subject
+
+
+
+
+
+ Message
+
+
+
+
+ )}
+
+
+
+ Cancel
+
+
+ Send
+
+
+
+
+
+ );
+};
+
+ConfirmReversalPopups.propTypes = {
+ isOpen: PropTypes.bool.isRequired,
+ onClose: PropTypes.func.isRequired,
+ handelApproved: PropTypes.func.isRequired,
+ isLoading: PropTypes.func.isRequired,
+};
+
+export default ConfirmReversalPopups;
diff --git a/src/Pages/BankDepositRequest/BankDepositRequest.jsx b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
index 259dd61..cd47f28 100644
--- a/src/Pages/BankDepositRequest/BankDepositRequest.jsx
+++ b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
@@ -330,19 +330,58 @@ const BankDepositRequest = () => {
}
};
+ const handleConfirm = async (data) => {
+ setIsReversalLoading.on(); // Start loading
+ try {
+ const { error, data: responseData } = await rejectbankDepositRequest({
+ id: actionId,
+ data,
+ });
+
+ if (error) {
+ throw error; // Explicitly handle the error
+ }
+
+ // Success: Perform necessary actions
+ refetch();
+ toast({
+ render: () => (
+
+ ),
+ });
+ onRejectClose();
+ } catch (error) {
+ // Handle errors
+ toast({
+ render: () => (
+
+ ),
+ });
+ console.error("Error:", error);
+ } finally {
+ setIsReversalLoading.off(); // Ensure loading is toggled off
+ }
+ };
+
+
return (
{/* */}
diff --git a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
index b5e70ec..be5ea72 100644
--- a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
+++ b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
@@ -24,9 +24,10 @@ import { OPACITY_ON_LOAD } from "../../Layout/animations";
import { useGetFawateerForMakerRequestQuery } from "../../Services/fawateer.request.service";
import ConfirmModal from "./ConfirmModal";
import RejectModal from "./RejectModal";
-import { useGetFawateerDepositMasterQuery, useRejectFawateerRequestMutation } from "../../Services/reversal.fawateer.deposit.service";
+import { useApproveFawateerRequestMutation, useGetFawateerDepositMasterQuery, useRejectFawateerRequestMutation } from "../../Services/reversal.fawateer.deposit.service";
import RejectReversalPopups from "../../Components/Popups/RejectReversalPopups";
import ToastBox from "../../Components/ToastBox";
+import ConfirmReversalPopups from "../../Components/Popups/ConfirmReversalPopups";
const ReversalFawateerDeposit = () => {
const toast = useToast();
@@ -43,6 +44,8 @@ import ToastBox from "../../Components/ToastBox";
const [rejectFawateerRequest] = useRejectFawateerRequestMutation();
+ const [approveFawateerRequest] = useApproveFawateerRequestMutation();
+
const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
@@ -351,12 +354,11 @@ import ToastBox from "../../Components/ToastBox";
alertHandler={handleDelete}
isLoading={isLoading}
/>
-
Date: Fri, 17 Jan 2025 17:09:34 +0530
Subject: [PATCH 27/50] Implement account deletion reversal functionality in
DeletionHistory component
---
.../ReversalAccountDeletion.jsx | 649 ++++++++--------
.../ReversalFawateerDeposit.jsx | 708 +++++++++---------
2 files changed, 698 insertions(+), 659 deletions(-)
diff --git a/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx b/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
index 955fa23..fcd85c8 100644
--- a/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
+++ b/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
@@ -1,323 +1,362 @@
+import { CheckIcon, CloseIcon } from "@chakra-ui/icons";
import {
- Avatar,
- Badge,
- Box,
- Button,
- HStack,
- Input,
- Text,
- Tooltip,
- useDisclosure,
- useToast,
- } from "@chakra-ui/react";
- import React, { useContext, useEffect, useState } from "react";
- import { OPACITY_ON_LOAD } from "../../Layout/animations";
- import NormalTable from "../../Components/DataTable/NormalTable";
- import Pagination from "../../Components/Pagination";
- import GlobalStateContext from "../../Contexts/GlobalStateContext";
- import CustomAlertDialog from "../../Components/CustomAlertDialog";
- import { formatDate } from "../../Components/Functions/UTCConvertor";
- import { CheckIcon, CloseIcon } from "@chakra-ui/icons";
- import { useGetDeleteHistoryQuery } from "../../Services/delete.request.service";
- import { TABLE_PAGINATION } from "../../Constants/Paginations";
+ Box,
+ Button,
+ HStack,
+ Input,
+ Text,
+ Tooltip,
+ useBoolean,
+ useDisclosure,
+ useToast,
+} from "@chakra-ui/react";
+import React, { useContext, useEffect, useState } from "react";
+import CustomAlertDialog from "../../Components/CustomAlertDialog";
+import NormalTable from "../../Components/DataTable/NormalTable";
+import { TABLE_PAGINATION } from "../../Constants/Paginations";
+import GlobalStateContext from "../../Contexts/GlobalStateContext";
+import { OPACITY_ON_LOAD } from "../../Layout/animations";
+import {
+ useGetAccountDeletionMasterQuery,
+ useRejectAccountDeletionRequestMutation,
+} from "../../Services/reversal.account.deletion.service";
import ConfirmModal from "./ConfirmModal";
import RejectModal from "./RejectModal";
-import { useGetAccountDeletionMasterQuery } from "../../Services/reversal.account.deletion.service";
- // import { formatDate } from "../../Components/Functions/UTCConvertor";
-
- const ReversalAccountDeletion = () => {
- const toast = useToast();
- const { slideFromRight, setDeleteHistory } =
- useContext(GlobalStateContext);
- const [deleteAlert, setDeleteAlert] = useState(false);
- const [actionId, setActionId] = useState(false);
- const [mouseEntered, setMouseEntered] = useState(false);
- const [mouseEnteredId, setMouseEnteredId] = useState("");
-
-
-
- // =========================== [Use State] =============================
- const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
- const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
- const [searchTerm, setSearchTerm] = useState("");
- const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
+import RejectReversalPopups from "../../Components/Popups/RejectReversalPopups";
+import ToastBox from "../../Components/ToastBox";
+// import { formatDate } from "../../Components/Functions/UTCConvertor";
- const {
- isOpen: isConfirmOpen,
- onOpen: onConfirmOpen,
- onClose: onConfirmClose,
- } = useDisclosure();
- const {
- isOpen: isRejectOpen,
- onOpen: onRejectOpen,
- onClose: onRejectClose,
- } = useDisclosure();
-
- // 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]);
-
-
- const {
- data: deleteHistory,
- isLoading,
- refetch
- } = useGetAccountDeletionMasterQuery({
- page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
- size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+const ReversalAccountDeletion = () => {
+ const toast = useToast();
+ const { slideFromRight, setDeleteHistory } = useContext(GlobalStateContext);
+ const [deleteAlert, setDeleteAlert] = useState(false);
+ const [actionId, setActionId] = useState(false);
+ const [mouseEntered, setMouseEntered] = useState(false);
+ const [mouseEnteredId, setMouseEnteredId] = useState("");
+
+ // =========================== [Use State] =============================
+ const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
+ const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
+ const [searchTerm, setSearchTerm] = useState("");
+ const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
+
+ const [isReversalLoading, setIsReversalLoading] = useBoolean();
+
+ const {
+ isOpen: isConfirmOpen,
+ onOpen: onConfirmOpen,
+ onClose: onConfirmClose,
+ } = useDisclosure();
+ const {
+ isOpen: isRejectOpen,
+ onOpen: onRejectOpen,
+ onClose: onRejectClose,
+ } = useDisclosure();
+
+ const [rejectAccountDeletionRequest] =
+ useRejectAccountDeletionRequestMutation();
+
+ // 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]);
+
+ const {
+ data: deleteHistory,
+ isLoading,
+ refetch,
+ } = useGetAccountDeletionMasterQuery(
+ {
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
search: debouncedSearchTerm,
},
{
skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
- })
-
- const formatDate = (date) => {
- return new Date(date).toLocaleDateString('en-GB', {
- day: '2-digit',
- month: '2-digit',
- year: 'numeric',
- });
- };
-
- // Use useEffect to refetch data when the component mounts
- useEffect(() => {
+ }
+ );
+
+ const formatDate = (date) => {
+ return new Date(date).toLocaleDateString("en-GB", {
+ day: "2-digit",
+ month: "2-digit",
+ year: "numeric",
+ });
+ };
+
+ // Use useEffect to refetch data when the component mounts
+ useEffect(() => {
refetch();
}, [refetch]);
-
-
- // ====================================================[Table Setup]================================================================
- const tableHeadRow = [
- "Sr No.",
- "Request Date",
- "Client ID",
- "First Name",
- "Last Name",
- "Phone Number",
- "Country",
- "Action"
- ];
-
- const extractedArray = deleteHistory?.data?.rows?.map((item, index) => ({
- id: item?.id,
- "Sr No.": (
- ({
+ id: item?.id,
+ "Sr No.": (
+
+ {index + 1}.
+
+ ),
+ "Request Date": (
+
+ {formatDate(item.isReversalDate)}
+
+ ),
+ "Client ID": (
+
+ {item?.iamPrincipal?.investor_details?.clientReference_id}
+
+ ),
+ "First Name": (
+
+ {item?.iamPrincipal?.firstName}
+ {/* {formatDate(item.charge)} */}
+
+ ),
+ "Last Name": (
+
+ {item?.iamPrincipal?.lastName}
+
+ ),
+ "Phone Number": (
+
+ {item?.iamPrincipal?.ISDcode + " " + item?.iamPrincipal?.mobileNumber}
+
+ ),
+ Country: (
+
+ {item?.iamPrincipal?.investor_details?.country?.countryName}
+
+ ),
+ Action: (
+
+
- {index + 1}.
-
- ),
- "Request Date": (
-
- {formatDate(item.Requested_on)}
-
- ),
- "Client ID": (
-
- {item.clientId}
-
- ),
- "First Name": (
-
- {item.firstName}
- {/* {formatDate(item.charge)} */}
-
- ),
- "Last Name": (
-
- {item.lastName}
-
- ),
- "Phone Number": (
-
- {item.phoneNumber}
-
- ),
- "Country": (
-
- {item.country}
-
- ),
- "Action": (
-
- {
+ setActionId(item.id);
+ onConfirmOpen();
+ }}
+ colorScheme="green"
+ variant={"solid"}
+ cursor={"pointer"}
>
- {
- setActionId(item.id);
- onConfirmOpen();
- }}
- colorScheme="green"
- variant={"solid"}
- cursor={"pointer"}
- >
-
-
-
-
+
+
+
+ {
+ setActionId(item.id);
+ onRejectOpen();
+ }}
+ py={1}
+ // variant={"solid"}
>
- {
- setActionId(item.id);
- onRejectOpen();
- }}
- py={1}
- // variant={"solid"}
- >
-
-
-
-
- ),
- }));
-
- const handleDelete = () => {
- const deleteHistory = sponser.filter(
- (sponsor) => sponsor.id !== actionId
- );
-
- setTimeout(() => {
- setSponser(deleteHistory);
- setDeleteAlert(false);
- setIsLoading(false);
- }, 100);
- setIsLoading(true);
- };
-
- return (
-
-
-
- setSearchTerm(e.target.value)}
- />
-
- {/*
+
+
+
+
+ ),
+ }));
+
+ const handleDelete = () => {
+ const deleteHistory = sponser.filter((sponsor) => sponsor.id !== actionId);
+
+ setTimeout(() => {
+ setSponser(deleteHistory);
+ setDeleteAlert(false);
+ setIsLoading(false);
+ }, 100);
+ setIsLoading(true);
+ };
+
+ const handleApproved = async (data) => {
+ setIsReversalLoading.on(); // Start loading
+ try {
+ const { error, data: responseData } = await rejectAccountDeletionRequest({
+ id: actionId,
+ data,
+ });
+
+ if (error) {
+ throw error; // Explicitly handle the error
+ }
+
+ // Success: Perform necessary actions
+ refetch();
+ toast({
+ render: () => (
+
+ ),
+ });
+ onRejectClose();
+ } catch (error) {
+ // Handle errors
+ toast({
+ render: () => (
+
+ ),
+ });
+ console.error("Error:", error);
+ } finally {
+ setIsReversalLoading.off(); // Ensure loading is toggled off
+ }
+ };
+
+ return (
+
+
+
+ setSearchTerm(e.target.value)}
+ />
+
+ {/*
*/}
-
-
-
-
-
- setDeleteAlert(false)}
- isOpen={deleteAlert}
- message={"Are you sure you want to delete sponers?"}
- alertHandler={handleDelete}
- isLoading={isLoading}
- />
-
-
+
- );
- };
-
- export default ReversalAccountDeletion;
-
\ No newline at end of file
+
+
+
+ setDeleteAlert(false)}
+ isOpen={deleteAlert}
+ message={"Are you sure you want to delete sponers?"}
+ alertHandler={handleDelete}
+ isLoading={isLoading}
+ />
+
+
+
+ );
+};
+
+export default ReversalAccountDeletion;
diff --git a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
index be5ea72..17bac2c 100644
--- a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
+++ b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
@@ -1,19 +1,19 @@
import {
- Avatar,
- Badge,
- Box,
- Button,
- HStack,
- Input,
- Link,
- Text,
- Tooltip,
- useBoolean,
- useDisclosure,
- useToast,
- } from "@chakra-ui/react";
- import React, { useContext, useEffect, useState } from "react";
- import { CheckIcon, CloseIcon, ExternalLinkIcon } from "@chakra-ui/icons";
+ Avatar,
+ Badge,
+ Box,
+ Button,
+ HStack,
+ Input,
+ Link,
+ Text,
+ Tooltip,
+ useBoolean,
+ useDisclosure,
+ useToast,
+} from "@chakra-ui/react";
+import React, { useContext, useEffect, useState } from "react";
+import { CheckIcon, CloseIcon, ExternalLinkIcon } from "@chakra-ui/icons";
import Pagination from "../../Components/Pagination";
import GlobalStateContext from "../../Contexts/GlobalStateContext";
import CustomAlertDialog from "../../Components/CustomAlertDialog";
@@ -24,351 +24,351 @@ import { OPACITY_ON_LOAD } from "../../Layout/animations";
import { useGetFawateerForMakerRequestQuery } from "../../Services/fawateer.request.service";
import ConfirmModal from "./ConfirmModal";
import RejectModal from "./RejectModal";
-import { useApproveFawateerRequestMutation, useGetFawateerDepositMasterQuery, useRejectFawateerRequestMutation } from "../../Services/reversal.fawateer.deposit.service";
+import {
+ useApproveFawateerRequestMutation,
+ useGetFawateerDepositMasterQuery,
+ useRejectFawateerRequestMutation,
+} from "../../Services/reversal.fawateer.deposit.service";
import RejectReversalPopups from "../../Components/Popups/RejectReversalPopups";
import ToastBox from "../../Components/ToastBox";
import ConfirmReversalPopups from "../../Components/Popups/ConfirmReversalPopups";
-
- const ReversalFawateerDeposit = () => {
- const toast = useToast();
- const { slideFromRight, approveHistory, setApproveHistory } =
- useContext(GlobalStateContext);
- const [searchTerm, setSearchTerm] = useState("");
- const [isLoading, setIsLoading] = useState(true);
- const [deleteAlert, setDeleteAlert] = useState(false);
- const [actionId, setActionId] = useState(false);
- const [mouseEntered, setMouseEntered] = useState(false);
- const [mouseEnteredId, setMouseEnteredId] = useState("");
- const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
- const [isReversalLoading, setIsReversalLoading] = useBoolean();
-
- const [rejectFawateerRequest] = useRejectFawateerRequestMutation();
- const [approveFawateerRequest] = useApproveFawateerRequestMutation();
+const ReversalFawateerDeposit = () => {
+ const toast = useToast();
+ const { slideFromRight, approveHistory, setApproveHistory } =
+ useContext(GlobalStateContext);
+ const [searchTerm, setSearchTerm] = useState("");
+ const [isLoading, setIsLoading] = useState(true);
+ const [deleteAlert, setDeleteAlert] = useState(false);
+ const [actionId, setActionId] = useState(false);
+ const [mouseEntered, setMouseEntered] = useState(false);
+ const [mouseEnteredId, setMouseEnteredId] = useState("");
+ const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
+ const [isReversalLoading, setIsReversalLoading] = useBoolean();
- const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
- const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
-
- const formatDate = (date) => {
- return new Date(date).toLocaleDateString("en-GB", {
- day: "2-digit",
- month: "2-digit",
- year: "numeric",
- });
- };
-
- const {
- isOpen: isConfirmOpen,
- onOpen: onConfirmOpen,
- onClose: onConfirmClose,
- } = useDisclosure();
- const {
- isOpen: isRejectOpen,
- onOpen: onRejectOpen,
- onClose: onRejectClose,
- } = useDisclosure();
+ const [rejectFawateerRequest] = useRejectFawateerRequestMutation();
- const {
- data,
- isLoading: drawalRequestLoading,
- error,
- refetch
- } = useGetFawateerDepositMasterQuery(
- {
- page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
- size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
- searchTerm: debouncedSearchTerm,
- },
- {
- skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
- }
- );
-
- console.log("ffffffffffffffffffffff",data?.data?.rows);
+ const [approveFawateerRequest] = useApproveFawateerRequestMutation();
- useEffect(() => {
- const handler = setTimeout(() => {
- setDebouncedSearchTerm(searchTerm);
- }, 500); // Adjust delay as needed
- return () => {
- clearTimeout(handler);
- };
- }, [searchTerm]);
-
- // Use useEffect to refetch data when the component mounts
- useEffect(() => {
- refetch();
- }, [refetch]);
-
- useEffect(() => {
- // Simulate loading
- const timer = setTimeout(() => {
- setIsLoading(false);
- }, 1500);
-
- // Cleanup the timer on component unmount
- return () => clearTimeout(timer);
- }, []);
-
- // ====================================================[Table Filter]================================================================
- const filteredData =data?.data?.rows?.filter((item) => {
- // Filter by name (case insensitive)
- const name = item.principal?.firstName;
- const searchLower = searchTerm.toLowerCase();
- const nameMatches = name.toLowerCase().includes(searchLower);
-
- return nameMatches;
+ const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
+ const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
+
+ const formatDate = (date) => {
+ return new Date(date).toLocaleDateString("en-GB", {
+ day: "2-digit",
+ month: "2-digit",
+ year: "numeric",
});
-
- // ====================================================[Table Setup]================================================================
- const tableHeadRow = [
- "Sr.no",
- "Request Date",
- "Client ID",
- "First Name",
- "Last Name",
- "Phone Number",
- "Action",
- ];
-
- const extractedArray = data?.data?.rows?.map((item, idx) => ({
-
- // id: item?.id,
- "Sr.no": (
-
- {generateSerialNumber(idx, currentPage, pageSize)}
-
- ),
- "Request Date": (
-
- {formatDate(item?.transaction_details?.isReversalDate)}
-
- ),
- "Client ID": (
-
- {item?.principal?.investor_details?.clientReference_id}
-
- ),
- "First Name": (
-
-
- {item?.principal?.firstName}
-
-
- ),
- "Last Name": (
-
-
- {item?.principal?.lastName}
-
-
- ),
- "Phone Number": (
-
-
- {item?.principal?.mobileNumber}
-
-
- ),
- Action: (
-
-
- {
- setActionId(item.id);
- onConfirmOpen();
- }}
- colorScheme="green"
- variant={"solid"}
- cursor={"pointer"}
- >
-
-
-
-
- {
- setActionId(item.id);
- onRejectOpen();
- }}
- py={1}
- // variant={"solid"}
- >
-
-
-
-
- ),
- }));
-
- const handleDelete = () => {
- const updatedSponsors = sponser.filter(
- (sponsor) => sponsor.id !== actionId
- );
-
- setTimeout(() => {
- setSponser(updatedSponsors);
- setDeleteAlert(false);
- setIsLoading(false);
- }, 100);
- setIsLoading(true);
- };
-
- const handleApproved = async (data) => {
- setIsReversalLoading.on(); // Start loading
- try {
- const { error, data: responseData } = await rejectFawateerRequest({
- id: actionId,
- data,
- });
-
- if (error) {
- throw error; // Explicitly handle the error
- }
-
- // Success: Perform necessary actions
- refetch();
- toast({
- render: () => (
-
- ),
- });
- onRejectClose();
- } catch (error) {
- // Handle errors
- toast({
- render: () => (
-
- ),
- });
- console.error("Error:", error);
- } finally {
- setIsReversalLoading.off(); // Ensure loading is toggled off
- }
- };
-
- return (
-
-
-
- setSearchTerm(e.target.value)}
- />
-
-
-
-
-
-
-
- setDeleteAlert(false)}
- isOpen={deleteAlert}
- message={"Are you sure you want to delete sponers?"}
- alertHandler={handleDelete}
- isLoading={isLoading}
- />
-
-
-
- );
};
-
- export default ReversalFawateerDeposit;
-
\ No newline at end of file
+
+ const {
+ isOpen: isConfirmOpen,
+ onOpen: onConfirmOpen,
+ onClose: onConfirmClose,
+ } = useDisclosure();
+ const {
+ isOpen: isRejectOpen,
+ onOpen: onRejectOpen,
+ onClose: onRejectClose,
+ } = useDisclosure();
+
+ const {
+ data,
+ isLoading: drawalRequestLoading,
+ error,
+ refetch,
+ } = useGetFawateerDepositMasterQuery(
+ {
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+ searchTerm: debouncedSearchTerm,
+ },
+ {
+ skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
+ }
+ );
+
+ useEffect(() => {
+ const handler = setTimeout(() => {
+ setDebouncedSearchTerm(searchTerm);
+ }, 500); // Adjust delay as needed
+ return () => {
+ clearTimeout(handler);
+ };
+ }, [searchTerm]);
+
+ // Use useEffect to refetch data when the component mounts
+ useEffect(() => {
+ refetch();
+ }, [refetch]);
+
+ useEffect(() => {
+ // Simulate loading
+ const timer = setTimeout(() => {
+ setIsLoading(false);
+ }, 1500);
+
+ // Cleanup the timer on component unmount
+ return () => clearTimeout(timer);
+ }, []);
+
+ // ====================================================[Table Filter]================================================================
+ const filteredData = data?.data?.rows?.filter((item) => {
+ // Filter by name (case insensitive)
+ const name = item.principal?.firstName;
+ const searchLower = searchTerm.toLowerCase();
+ const nameMatches = name.toLowerCase().includes(searchLower);
+
+ return nameMatches;
+ });
+
+ // ====================================================[Table Setup]================================================================
+ const tableHeadRow = [
+ "Sr.no",
+ "Request Date",
+ "Client ID",
+ "First Name",
+ "Last Name",
+ "Phone Number",
+ "Action",
+ ];
+
+ const extractedArray = data?.data?.rows?.map((item, idx) => ({
+ // id: item?.id,
+ "Sr.no": (
+
+ {generateSerialNumber(idx, currentPage, pageSize)}
+
+ ),
+ "Request Date": (
+
+ {formatDate(item?.transaction_details?.isReversalDate)}
+
+ ),
+ "Client ID": (
+
+ {item?.principal?.investor_details?.clientReference_id}
+
+ ),
+ "First Name": (
+
+
+ {item?.principal?.firstName}
+
+
+ ),
+ "Last Name": (
+
+
+ {item?.principal?.lastName}
+
+
+ ),
+ "Phone Number": (
+
+
+ {item?.principal?.mobileNumber}
+
+
+ ),
+ Action: (
+
+
+ {
+ setActionId(item.id);
+ onConfirmOpen();
+ }}
+ colorScheme="green"
+ variant={"solid"}
+ cursor={"pointer"}
+ >
+
+
+
+
+ {
+ setActionId(item.id);
+ onRejectOpen();
+ }}
+ py={1}
+ // variant={"solid"}
+ >
+
+
+
+
+ ),
+ }));
+
+ const handleDelete = () => {
+ const updatedSponsors = sponser.filter(
+ (sponsor) => sponsor.id !== actionId
+ );
+
+ setTimeout(() => {
+ setSponser(updatedSponsors);
+ setDeleteAlert(false);
+ setIsLoading(false);
+ }, 100);
+ setIsLoading(true);
+ };
+
+ const handleApproved = async (data) => {
+ setIsReversalLoading.on(); // Start loading
+ try {
+ const { error, data: responseData } = await rejectFawateerRequest({
+ id: actionId,
+ data,
+ });
+
+ if (error) {
+ throw error; // Explicitly handle the error
+ }
+
+ // Success: Perform necessary actions
+ refetch();
+ toast({
+ render: () => (
+
+ ),
+ });
+ onRejectClose();
+ } catch (error) {
+ // Handle errors
+ toast({
+ render: () => (
+
+ ),
+ });
+ console.error("Error:", error);
+ } finally {
+ setIsReversalLoading.off(); // Ensure loading is toggled off
+ }
+ };
+
+ return (
+
+
+
+ setSearchTerm(e.target.value)}
+ />
+
+
+
+
+
+
+
+ setDeleteAlert(false)}
+ isOpen={deleteAlert}
+ message={"Are you sure you want to delete sponers?"}
+ alertHandler={handleDelete}
+ isLoading={isLoading}
+ />
+
+
+
+ );
+};
+
+export default ReversalFawateerDeposit;
From 79c822bb4dc642d27844813d38330dbb2bcb11b5 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Fri, 17 Jan 2025 17:45:51 +0530
Subject: [PATCH 28/50] [ bankdeposite aprove ]
---
.../Popups/ConfirmReversalPopups.jsx | 24 ++++++++++++++-----
.../BankDepositRequest/BankDepositRequest.jsx | 10 +++++---
2 files changed, 25 insertions(+), 9 deletions(-)
diff --git a/src/Components/Popups/ConfirmReversalPopups.jsx b/src/Components/Popups/ConfirmReversalPopups.jsx
index b97551c..8918201 100644
--- a/src/Components/Popups/ConfirmReversalPopups.jsx
+++ b/src/Components/Popups/ConfirmReversalPopups.jsx
@@ -14,8 +14,9 @@ import {
ModalOverlay,
Text,
Textarea,
+ useBoolean,
} from "@chakra-ui/react";
-import React, { useState } from "react";
+import React, { useEffect, useState } from "react";
import PropTypes from "prop-types";
import * as yup from "yup";
@@ -30,6 +31,8 @@ export const conformModalSchema = yup.object().shape({
.max(150, "Maximum length should be 150 characters.")
.matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
.required("Comment is required"),
+ subject: yup.string().notRequired(),
+ emailTemplate: yup.string().notRequired(),
});
const ConfirmReversalPopups = ({
@@ -43,14 +46,20 @@ const ConfirmReversalPopups = ({
register,
reset,
handleSubmit,
+ setValue,
formState: { errors },
} = useForm({
resolver: yupResolver(conformModalSchema),
mode: "all",
});
- const [emailApproval, setEmailApproval] = useState(false);
+ const [richTextValue, setRichTextValue] = useState("");
+ useEffect(() => {
+ setValue("emailTemplate", richTextValue);
+ }, [richTextValue]);
+
+ const [emailApproval, setEmailApproval] = useBoolean(false);
const modules = {
toolbar: [
@@ -107,7 +116,8 @@ const ConfirmReversalPopups = ({
setEmailApproval(e.target.checked)}
+ onChange={setEmailApproval.toggle}
+ defaultChecked={emailApproval}
>
Send an email to the user upon approval
@@ -122,7 +132,7 @@ const ConfirmReversalPopups = ({
@@ -178,6 +188,8 @@ ConfirmReversalPopups.propTypes = {
onClose: PropTypes.func.isRequired,
handelApproved: PropTypes.func.isRequired,
isLoading: PropTypes.func.isRequired,
+ richTextValue: PropTypes.any.isRequired,
+ setRichTextValue: PropTypes.any.isRequired,
};
export default ConfirmReversalPopups;
diff --git a/src/Pages/BankDepositRequest/BankDepositRequest.jsx b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
index cd47f28..bfd1f3e 100644
--- a/src/Pages/BankDepositRequest/BankDepositRequest.jsx
+++ b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
@@ -29,6 +29,7 @@ import Pagination from "../../Components/Pagination";
import ConfirmModal from "./ConfirmModal";
import RejectModal from "./RejectModal";
import {
+ useApproveBankDepositRequestMutation,
useGetBankDepositMasterQuery,
useRejectbankDepositRequestMutation,
} from "../../Services/bankdeposit.request.service";
@@ -71,6 +72,9 @@ const BankDepositRequest = () => {
const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
const [rejectbankDepositRequest] = useRejectbankDepositRequestMutation();
+
+ const [approveBankDepositRequest] = useApproveBankDepositRequestMutation();
+
const [isReversalLoading, setIsReversalLoading] = useBoolean();
// Debounce the search term to avoid making a request on every keystroke
@@ -178,7 +182,7 @@ const BankDepositRequest = () => {
fontWeight={"500"}
className="d-flex align-items-center web-text-small"
>
- {formatDate(item?.createdAt)}
+ {formatDate(item?.isReversalDate)}
),
"Client ID": (
@@ -331,9 +335,10 @@ const BankDepositRequest = () => {
};
const handleConfirm = async (data) => {
+
setIsReversalLoading.on(); // Start loading
try {
- const { error, data: responseData } = await rejectbankDepositRequest({
+ const { error, data: responseData } = await approveBankDepositRequest({
id: actionId,
data,
});
@@ -367,7 +372,6 @@ const BankDepositRequest = () => {
setIsReversalLoading.off(); // Ensure loading is toggled off
}
};
-
return (
From 9f939939384fbc5bd8e108ab9ca5fb35fc945b2a Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Fri, 17 Jan 2025 17:51:58 +0530
Subject: [PATCH 29/50] [ update approve modal ]
---
.../ReversalAccountDeletion.jsx | 54 ++++++++++++++++---
.../ReversalFawateerDeposit.jsx | 44 ++++++++++++++-
2 files changed, 90 insertions(+), 8 deletions(-)
diff --git a/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx b/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
index fcd85c8..4b9df5c 100644
--- a/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
+++ b/src/Pages/ReversalAccountDeletion/ReversalAccountDeletion.jsx
@@ -17,6 +17,7 @@ import { TABLE_PAGINATION } from "../../Constants/Paginations";
import GlobalStateContext from "../../Contexts/GlobalStateContext";
import { OPACITY_ON_LOAD } from "../../Layout/animations";
import {
+ useApproveAccountDeletionRequestMutation,
useGetAccountDeletionMasterQuery,
useRejectAccountDeletionRequestMutation,
} from "../../Services/reversal.account.deletion.service";
@@ -24,6 +25,7 @@ import ConfirmModal from "./ConfirmModal";
import RejectModal from "./RejectModal";
import RejectReversalPopups from "../../Components/Popups/RejectReversalPopups";
import ToastBox from "../../Components/ToastBox";
+import ConfirmReversalPopups from "../../Components/Popups/ConfirmReversalPopups";
// import { formatDate } from "../../Components/Functions/UTCConvertor";
const ReversalAccountDeletion = () => {
@@ -53,8 +55,9 @@ const ReversalAccountDeletion = () => {
onClose: onRejectClose,
} = useDisclosure();
- const [rejectAccountDeletionRequest] =
- useRejectAccountDeletionRequestMutation();
+ const [rejectAccountDeletionRequest] = useRejectAccountDeletionRequestMutation();
+
+ const [approveAccountDeletionRequest] = useApproveAccountDeletionRequestMutation();
// Debounce the search term to avoid making a request on every keystroke
useEffect(() => {
@@ -293,6 +296,46 @@ const ReversalAccountDeletion = () => {
}
};
+ const handleConfirm = async (data) => {
+
+ setIsReversalLoading.on(); // Start loading
+ try {
+ const { error, data: responseData } = await approveAccountDeletionRequest({
+ id: actionId,
+ data,
+ });
+
+ if (error) {
+ throw error; // Explicitly handle the error
+ }
+
+ // Success: Perform necessary actions
+ refetch();
+ toast({
+ render: () => (
+
+ ),
+ });
+ onRejectClose();
+ } catch (error) {
+ // Handle errors
+ toast({
+ render: () => (
+
+ ),
+ });
+ console.error("Error:", error);
+ } finally {
+ setIsReversalLoading.off(); // Ensure loading is toggled off
+ }
+ };
+
+
return (
@@ -342,12 +385,11 @@ const ReversalAccountDeletion = () => {
alertHandler={handleDelete}
isLoading={isLoading}
/>
-
{
}
};
+
+ const handleConfirm = async (data) => {
+
+ setIsReversalLoading.on(); // Start loading
+ try {
+ const { error, data: responseData } = await approveFawateerRequest({
+ id: actionId,
+ data,
+ });
+
+ if (error) {
+ throw error; // Explicitly handle the error
+ }
+
+ // Success: Perform necessary actions
+ refetch();
+ toast({
+ render: () => (
+
+ ),
+ });
+ onRejectClose();
+ } catch (error) {
+ // Handle errors
+ toast({
+ render: () => (
+
+ ),
+ });
+ console.error("Error:", error);
+ } finally {
+ setIsReversalLoading.off(); // Ensure loading is toggled off
+ }
+ };
+
return (
@@ -358,9 +398,9 @@ const ReversalFawateerDeposit = () => {
+ />
Date: Fri, 17 Jan 2025 18:29:10 +0530
Subject: [PATCH 30/50] Filter navigation items based on user role in
DashboardLayout component
---
src/Layout/DefaultLayout.jsx | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/src/Layout/DefaultLayout.jsx b/src/Layout/DefaultLayout.jsx
index 843de6a..ad60b68 100644
--- a/src/Layout/DefaultLayout.jsx
+++ b/src/Layout/DefaultLayout.jsx
@@ -1,6 +1,5 @@
import React, { useContext, useEffect, useState } from "react";
import { CgProfile } from "react-icons/cg";
-import { useDispatch } from "react-redux";
import logoMiniDark from "../assets/favicon.png";
import logoMini from "../assets/logo-min.png";
import logoDark from "../assets/logo.png";
@@ -29,6 +28,7 @@ import {
import Cookies from "js-cookie"; // Import the Cookies library
import { GrManual } from "react-icons/gr";
import { HiOutlineChartSquareBar } from "react-icons/hi";
+import { HiOutlineBanknotes } from "react-icons/hi2";
import { LuContact } from "react-icons/lu";
import { MdNotificationsNone, MdOutlineAddChart } from "react-icons/md";
import {
@@ -54,6 +54,7 @@ import {
useNavigate,
} from "react-router-dom";
import HeaderMain from "../Components/HeaderMain";
+import { isMaker } from "../Constants/Constants";
import GlobalStateContext from "../Contexts/GlobalStateContext";
import CreateRequest from "../Pages/Fawateer/CreateRequest";
import ApproveHistory from "../Pages/FawateerChecker/ApproveHistory/ApproveHistoryChecker";
@@ -65,7 +66,6 @@ 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();
@@ -426,7 +426,17 @@ const DashboardLayout = ({ isOnline }) => {
return ;
}
- const filteredNav = nav.map((item) => {
+ const _filteredNav = isMaker()
+ ? nav.filter(
+ (item) =>
+ item.title !== "REVERSAL TRANSACTION" &&
+ item.path !== "/bank-deposit-request" &&
+ item.path !== "/reversal-fawateer-deposit" &&
+ item.path !== "/account-deletion-request"
+ )
+ : nav;
+
+ const filteredNav = _filteredNav.map((item) => {
if (item.submenu) {
return {
...item,
@@ -436,6 +446,9 @@ const DashboardLayout = ({ isOnline }) => {
),
};
}
+ // if (item.title === "REVERSAL TRANSACTION" && item.type === "title") {
+ // }
+
return item;
});
@@ -738,7 +751,7 @@ const DashboardLayout = ({ isOnline }) => {
to={path}
>
{Icon && }
-
Date: Fri, 17 Jan 2025 18:57:10 +0530
Subject: [PATCH 31/50] Fix validation schema by renaming 'comments' to
'comment' in InitiateReversalPopups component
---
src/Components/Popups/InitiateReversalPopups.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Components/Popups/InitiateReversalPopups.jsx b/src/Components/Popups/InitiateReversalPopups.jsx
index 67faded..c9c9810 100644
--- a/src/Components/Popups/InitiateReversalPopups.jsx
+++ b/src/Components/Popups/InitiateReversalPopups.jsx
@@ -21,7 +21,7 @@ import { yupResolver } from "@hookform/resolvers/yup";
import { useForm } from "react-hook-form";
export const conformModalSchema = yup.object().shape({
- comments: yup
+ comment: yup
.string()
.min(2, "Minimum length should be 150 characters.")
.max(150, "Maximum length should be 150 characters.")
From fba6a7ad4517c7c7c5414ba302038f000a457892 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Fri, 17 Jan 2025 19:08:29 +0530
Subject: [PATCH 32/50] Refactor validation schema by renaming 'comments' to
'comment' in InitiateReversalPopup component
---
src/Components/Popups/InitiateReversalPopups.jsx | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/src/Components/Popups/InitiateReversalPopups.jsx b/src/Components/Popups/InitiateReversalPopups.jsx
index c9c9810..4d54734 100644
--- a/src/Components/Popups/InitiateReversalPopups.jsx
+++ b/src/Components/Popups/InitiateReversalPopups.jsx
@@ -46,8 +46,6 @@ const InitiateReversalPopup = ({
mode: "all",
});
- console.log(isLoading);
-
return (
@@ -59,7 +57,7 @@ const InitiateReversalPopup = ({
onSubmit={handleSubmit((data) => {
handelApproved(data);
reset();
- onClose()
+ onClose();
})}
>
@@ -69,24 +67,24 @@ const InitiateReversalPopup = ({
rows={6}
focusBorderColor="green.400"
name="fileName"
- {...register("comments")}
+ {...register("comment")}
fontSize="sm"
type="textarea"
size="md"
- placeholder={"Enter your comments...."}
+ placeholder={"Enter your comment...."}
rounded={"md"}
resize={"none"}
mb={2}
/>
- {errors.comments ? (
+ {errors.comment ? (
- {errors.comments.message}
+ {errors.comment.message}
) : (
Maximum length should be 150 characters. You have entered{" "}
- {watch()?.comments?.length || 0} characters.
+ {watch()?.comment?.length || 0} characters.
)}
From efbb72ca4c8fe270530e8338818156ca6e3bfbb8 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Fri, 17 Jan 2025 19:16:10 +0530
Subject: [PATCH 33/50] Refactor validation schema by renaming 'comments' to
'comment' in ConfirmReversalPopups and RejectReversalPopups components
---
src/Components/Popups/ConfirmReversalPopups.jsx | 14 +++++++-------
src/Components/Popups/RejectReversalPopups.jsx | 14 +++++++-------
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/src/Components/Popups/ConfirmReversalPopups.jsx b/src/Components/Popups/ConfirmReversalPopups.jsx
index 8918201..eb42ad4 100644
--- a/src/Components/Popups/ConfirmReversalPopups.jsx
+++ b/src/Components/Popups/ConfirmReversalPopups.jsx
@@ -25,7 +25,7 @@ import { useForm } from "react-hook-form";
import ReactQuill from "react-quill";
export const conformModalSchema = yup.object().shape({
- comments: yup
+ comment: yup
.string()
.min(2, "Minimum length should be 150 characters.")
.max(150, "Maximum length should be 150 characters.")
@@ -93,24 +93,24 @@ const ConfirmReversalPopups = ({
- {errors.comments ? (
+ {errors.comment ? (
- {errors.comments.message}
+ {errors.comment.message}
) : (
Maximum length should be 150 characters. You have entered{" "}
- {watch()?.comments?.length || 0} characters.
+ {watch()?.comment?.length || 0} characters.
)}
diff --git a/src/Components/Popups/RejectReversalPopups.jsx b/src/Components/Popups/RejectReversalPopups.jsx
index 4bff86e..9df7924 100644
--- a/src/Components/Popups/RejectReversalPopups.jsx
+++ b/src/Components/Popups/RejectReversalPopups.jsx
@@ -21,7 +21,7 @@ import { yupResolver } from "@hookform/resolvers/yup";
import { useForm } from "react-hook-form";
export const conformModalSchema = yup.object().shape({
- comments: yup
+ comment: yup
.string()
.min(2, "Minimum length should be 150 characters.")
.max(150, "Maximum length should be 150 characters.")
@@ -66,24 +66,24 @@ const RejectReversalPopups = ({
- {errors.comments ? (
+ {errors.comment ? (
- {errors.comments.message}
+ {errors.comment.message}
) : (
Maximum length should be 150 characters. You have entered{" "}
- {watch()?.comments?.length || 0} characters.
+ {watch()?.comment?.length || 0} characters.
)}
From 05f1d4055e031a3fece42240db878f43d33f0760 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Fri, 17 Jan 2025 19:57:48 +0530
Subject: [PATCH 34/50] Refactor API queries to include pagination and search
parameters in bank deposit and account deletion services
---
.../ReversalFawateerDeposit.jsx | 6 ++----
src/Services/bankdeposit.request.service.js | 11 ++++++++++-
src/Services/reversal.account.deletion.service.js | 11 ++++++++++-
src/Services/reversal.fawateer.deposit.service.js | 10 +++++++++-
4 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
index ba42ea1..243ee7c 100644
--- a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
+++ b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
@@ -81,7 +81,7 @@ const ReversalFawateerDeposit = () => {
{
page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
- searchTerm: debouncedSearchTerm,
+ search: debouncedSearchTerm,
},
{
skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
@@ -301,9 +301,7 @@ const ReversalFawateerDeposit = () => {
}
};
-
const handleConfirm = async (data) => {
-
setIsReversalLoading.on(); // Start loading
try {
const { error, data: responseData } = await approveFawateerRequest({
@@ -400,7 +398,7 @@ const ReversalFawateerDeposit = () => {
onClose={onConfirmClose}
handleConfirm={handleConfirm}
isLoading={isReversalLoading}
- />
+ />
`/reversal-transactions/bank-transfer/getAll`,
+ query: ({ size, search, page }) => {
+ let baseURL = `/reversal-transactions/bank-transfer/getAll?search=${search || ""}`
+
+ // Conditionally append page and size parameters if they are defined
+ if (page !== undefined && size !== undefined) {
+ baseURL += `&page=${page}&size=${size}`;
+ }
+
+ return baseURL;
+ },
providesTags: ["getBankDeposit"],
}),
diff --git a/src/Services/reversal.account.deletion.service.js b/src/Services/reversal.account.deletion.service.js
index 66100d0..7b4be45 100644
--- a/src/Services/reversal.account.deletion.service.js
+++ b/src/Services/reversal.account.deletion.service.js
@@ -11,7 +11,16 @@ export const reversalAccountDeletionMaster = createApi({
// ======[Get All]=====
getAccountDeletionMaster: builder.query({
- query: () => `/reversal-transactions/account-deletion/getAll`,
+ query: ({ page, size, search, }) => {
+ let baseURL = `/reversal-transactions/account-deletion/getAll?search=${search || ""}`
+
+ // Conditionally append page and size parameters if they are defined
+ if (page !== undefined && size !== undefined) {
+ baseURL += `&page=${page}&size=${size}`;
+ }
+
+ return baseURL;
+ },
providesTags: ["getAccountDeletion"],
}),
diff --git a/src/Services/reversal.fawateer.deposit.service.js b/src/Services/reversal.fawateer.deposit.service.js
index 0d74222..891f48b 100644
--- a/src/Services/reversal.fawateer.deposit.service.js
+++ b/src/Services/reversal.fawateer.deposit.service.js
@@ -11,7 +11,15 @@ export const reversalFawateerDepositMaster = createApi({
// ======[Get All]=====
getFawateerDepositMaster: builder.query({
- query: () => `/reversal-transactions/fawateer/getAll`,
+ query: ({ search, page, size }) => {
+ let baseURL = `/reversal-transactions/fawateer/getAll?search=${search || ""}`
+ // Conditionally append page and size parameters if they are defined
+ if (page !== undefined && size !== undefined) {
+ baseURL += `&page=${page}&size=${size}`;
+ }
+
+ return baseURL;
+ },
providesTags: ["getFawateerDeposit"],
}),
From 2b89e52e58d22043dbf074b3f84fbf7ec655f15c Mon Sep 17 00:00:00 2001
From: satyam70288
Date: Sat, 18 Jan 2025 11:28:42 +0000
Subject: [PATCH 35/50] Remove number validation from Sponsor Name in
confirmation and rejection popups
---
src/Components/Popups/ConfirmReversalPopups.jsx | 1 -
src/Components/Popups/InitiateReversalPopups.jsx | 1 -
src/Components/Popups/RejectReversalPopups.jsx | 1 -
3 files changed, 3 deletions(-)
diff --git a/src/Components/Popups/ConfirmReversalPopups.jsx b/src/Components/Popups/ConfirmReversalPopups.jsx
index eb42ad4..1eded5b 100644
--- a/src/Components/Popups/ConfirmReversalPopups.jsx
+++ b/src/Components/Popups/ConfirmReversalPopups.jsx
@@ -29,7 +29,6 @@ export const conformModalSchema = yup.object().shape({
.string()
.min(2, "Minimum length should be 150 characters.")
.max(150, "Maximum length should be 150 characters.")
- .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
.required("Comment is required"),
subject: yup.string().notRequired(),
emailTemplate: yup.string().notRequired(),
diff --git a/src/Components/Popups/InitiateReversalPopups.jsx b/src/Components/Popups/InitiateReversalPopups.jsx
index 4d54734..6e4eba0 100644
--- a/src/Components/Popups/InitiateReversalPopups.jsx
+++ b/src/Components/Popups/InitiateReversalPopups.jsx
@@ -25,7 +25,6 @@ export const conformModalSchema = yup.object().shape({
.string()
.min(2, "Minimum length should be 150 characters.")
.max(150, "Maximum length should be 150 characters.")
- .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
.required("Comment is required"),
});
diff --git a/src/Components/Popups/RejectReversalPopups.jsx b/src/Components/Popups/RejectReversalPopups.jsx
index 9df7924..e025439 100644
--- a/src/Components/Popups/RejectReversalPopups.jsx
+++ b/src/Components/Popups/RejectReversalPopups.jsx
@@ -25,7 +25,6 @@ export const conformModalSchema = yup.object().shape({
.string()
.min(2, "Minimum length should be 150 characters.")
.max(150, "Maximum length should be 150 characters.")
- .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
.required("Comment is required"),
});
From af2485ba5806ffb5580a642c214bdd5b96c241f1 Mon Sep 17 00:00:00 2001
From: satyam70288
Date: Sat, 18 Jan 2025 11:30:54 +0000
Subject: [PATCH 36/50] Fix minimum length message for comment validation in
reversal popups
---
src/Components/Popups/ConfirmReversalPopups.jsx | 2 +-
src/Components/Popups/InitiateReversalPopups.jsx | 2 +-
src/Components/Popups/RejectReversalPopups.jsx | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/Components/Popups/ConfirmReversalPopups.jsx b/src/Components/Popups/ConfirmReversalPopups.jsx
index 1eded5b..5d03344 100644
--- a/src/Components/Popups/ConfirmReversalPopups.jsx
+++ b/src/Components/Popups/ConfirmReversalPopups.jsx
@@ -27,7 +27,7 @@ import ReactQuill from "react-quill";
export const conformModalSchema = yup.object().shape({
comment: yup
.string()
- .min(2, "Minimum length should be 150 characters.")
+ .min(2, "Minimum length should be 2 characters.")
.max(150, "Maximum length should be 150 characters.")
.required("Comment is required"),
subject: yup.string().notRequired(),
diff --git a/src/Components/Popups/InitiateReversalPopups.jsx b/src/Components/Popups/InitiateReversalPopups.jsx
index 6e4eba0..c67c665 100644
--- a/src/Components/Popups/InitiateReversalPopups.jsx
+++ b/src/Components/Popups/InitiateReversalPopups.jsx
@@ -23,7 +23,7 @@ import { useForm } from "react-hook-form";
export const conformModalSchema = yup.object().shape({
comment: yup
.string()
- .min(2, "Minimum length should be 150 characters.")
+ .min(2, "Minimum length should be 2 characters.")
.max(150, "Maximum length should be 150 characters.")
.required("Comment is required"),
});
diff --git a/src/Components/Popups/RejectReversalPopups.jsx b/src/Components/Popups/RejectReversalPopups.jsx
index e025439..ca3f5c9 100644
--- a/src/Components/Popups/RejectReversalPopups.jsx
+++ b/src/Components/Popups/RejectReversalPopups.jsx
@@ -23,7 +23,7 @@ import { useForm } from "react-hook-form";
export const conformModalSchema = yup.object().shape({
comment: yup
.string()
- .min(2, "Minimum length should be 150 characters.")
+ .min(2, "Minimum length should be 2 characters.")
.max(150, "Maximum length should be 150 characters.")
.required("Comment is required"),
});
From 714804fdd64edb27efd152d84483b9aaa233401f Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Mon, 20 Jan 2025 15:05:39 +0530
Subject: [PATCH 37/50] =?UTF-8?q?[=20Bug=20Fixing=20=F0=9F=91=8D=20]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Components/Popups/ConfirmReversalPopups.jsx | 9 ++++++++-
src/Components/Popups/InitiateReversalPopups.jsx | 11 +++++++++--
src/Components/Popups/RejectReversalPopups.jsx | 11 +++++++++--
src/Layout/DefaultLayout.jsx | 3 ++-
.../ApproveRequest/RequestApproveModal.jsx | 8 +++++++-
.../ApproveRequest/RequestRejectModal.jsx | 7 +++++++
src/Routes/Nav.js | 2 +-
7 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/src/Components/Popups/ConfirmReversalPopups.jsx b/src/Components/Popups/ConfirmReversalPopups.jsx
index eb42ad4..7e43416 100644
--- a/src/Components/Popups/ConfirmReversalPopups.jsx
+++ b/src/Components/Popups/ConfirmReversalPopups.jsx
@@ -29,7 +29,7 @@ export const conformModalSchema = yup.object().shape({
.string()
.min(2, "Minimum length should be 150 characters.")
.max(150, "Maximum length should be 150 characters.")
- .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
+ // .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
.required("Comment is required"),
subject: yup.string().notRequired(),
emailTemplate: yup.string().notRequired(),
@@ -59,6 +59,13 @@ const ConfirmReversalPopups = ({
setValue("emailTemplate", richTextValue);
}, [richTextValue]);
+ // Reset the form when the modal closes
+ useEffect(() => {
+ if (!isOpen) {
+ reset(); // Clear the form state
+ }
+ }, [isOpen, reset]);
+
const [emailApproval, setEmailApproval] = useBoolean(false);
const modules = {
diff --git a/src/Components/Popups/InitiateReversalPopups.jsx b/src/Components/Popups/InitiateReversalPopups.jsx
index 4d54734..7ac6fa5 100644
--- a/src/Components/Popups/InitiateReversalPopups.jsx
+++ b/src/Components/Popups/InitiateReversalPopups.jsx
@@ -13,7 +13,7 @@ import {
Text,
Textarea,
} from "@chakra-ui/react";
-import React from "react";
+import React, { useEffect } from "react";
import PropTypes from "prop-types";
import * as yup from "yup";
@@ -25,7 +25,7 @@ export const conformModalSchema = yup.object().shape({
.string()
.min(2, "Minimum length should be 150 characters.")
.max(150, "Maximum length should be 150 characters.")
- .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
+ // .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
.required("Comment is required"),
});
@@ -46,6 +46,13 @@ const InitiateReversalPopup = ({
mode: "all",
});
+ // Reset the form when the modal closes
+ useEffect(() => {
+ if (!isOpen) {
+ reset(); // Clear the form state
+ }
+ }, [isOpen, reset]);
+
return (
diff --git a/src/Components/Popups/RejectReversalPopups.jsx b/src/Components/Popups/RejectReversalPopups.jsx
index 9df7924..03bca87 100644
--- a/src/Components/Popups/RejectReversalPopups.jsx
+++ b/src/Components/Popups/RejectReversalPopups.jsx
@@ -13,7 +13,7 @@ import {
Text,
Textarea,
} from "@chakra-ui/react";
-import React from "react";
+import React, { useEffect } from "react";
import PropTypes from "prop-types";
import * as yup from "yup";
@@ -25,7 +25,7 @@ export const conformModalSchema = yup.object().shape({
.string()
.min(2, "Minimum length should be 150 characters.")
.max(150, "Maximum length should be 150 characters.")
- .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
+ // .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
.required("Comment is required"),
});
@@ -46,6 +46,13 @@ const RejectReversalPopups = ({
mode: "all",
});
+ // Reset the form when the modal closes
+ useEffect(() => {
+ if (!isOpen) {
+ reset(); // Clear the form state
+ }
+ }, [isOpen, reset]);
+
return (
diff --git a/src/Layout/DefaultLayout.jsx b/src/Layout/DefaultLayout.jsx
index ad60b68..c5475bc 100644
--- a/src/Layout/DefaultLayout.jsx
+++ b/src/Layout/DefaultLayout.jsx
@@ -302,7 +302,7 @@ const DashboardLayout = ({ isOnline }) => {
return (
- Bank Deposit Request
+ Reversal Transaction / Deposit Request
);
case path.startsWith("/reversal-fawateer-deposit"):
@@ -733,6 +733,7 @@ const DashboardLayout = ({ isOnline }) => {
} else if (type === "single") {
return (
{
}
}, [data, reset]);
+ useEffect(() => {
+ if (!isOpen) {
+ reset();
+ }
+ }, [isOpen, reset]);
+
const heandleOnClose = () =>{
reset()
onClose()
@@ -130,7 +136,7 @@ const RequestApproveModal = ({ isOpen, onClose, firstField ,id}) => {
fontSize="sm"
type="textarea"
size="md"
- placeholder={"Enter your checkerComment...."}
+ placeholder={"Enter your checker Comment...."}
rounded={"md"}
resize={"none"}
maxLength={200}
diff --git a/src/Pages/FawateerChecker/ApproveRequest/RequestRejectModal.jsx b/src/Pages/FawateerChecker/ApproveRequest/RequestRejectModal.jsx
index 35f8873..7cad5bb 100644
--- a/src/Pages/FawateerChecker/ApproveRequest/RequestRejectModal.jsx
+++ b/src/Pages/FawateerChecker/ApproveRequest/RequestRejectModal.jsx
@@ -42,6 +42,13 @@ const RequestRejectModal = ({ isOpen, onClose, firstField ,id}) => {
resolver: yupResolver(conformModalSchema),
});
+ useEffect(() => {
+ if (!isOpen) {
+ reset(); // Clear the form state
+ }
+ }, [isOpen, reset]);
+
+
const [ rejectFawateer ] = useRejectCommentMutation()
diff --git a/src/Routes/Nav.js b/src/Routes/Nav.js
index a9d3484..e37c196 100644
--- a/src/Routes/Nav.js
+++ b/src/Routes/Nav.js
@@ -109,7 +109,7 @@ export const nav = [
title: "Fawateer Deposit",
submenu: [
{
- title: "Aprover Request",
+ title: "Approver Request",
path: "/fawateer",
icon: RiMoneyDollarBoxLine,
},
From 2892334e417c5b869396d0d4032fcd882f2827ea Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Mon, 20 Jan 2025 16:56:31 +0530
Subject: [PATCH 38/50] [ bug fixing done]
---
.../Popups/RejectReversalPopups.jsx | 2 +-
.../ApproveRequest/RequestRejectModal.jsx | 21 +++++++++++++++++--
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/src/Components/Popups/RejectReversalPopups.jsx b/src/Components/Popups/RejectReversalPopups.jsx
index 5b3e09c..23fc9dc 100644
--- a/src/Components/Popups/RejectReversalPopups.jsx
+++ b/src/Components/Popups/RejectReversalPopups.jsx
@@ -27,7 +27,7 @@ export const conformModalSchema = yup.object().shape({
.max(150, "Maximum length should be 150 characters.")
// .matches(/^[^\d]+$/, "Sponsor Name cannot contain numbers")
.required("Comment is required"),
-});
+});
const RejectReversalPopups = ({
isOpen,
diff --git a/src/Pages/FawateerChecker/ApproveRequest/RequestRejectModal.jsx b/src/Pages/FawateerChecker/ApproveRequest/RequestRejectModal.jsx
index 7cad5bb..b9178fd 100644
--- a/src/Pages/FawateerChecker/ApproveRequest/RequestRejectModal.jsx
+++ b/src/Pages/FawateerChecker/ApproveRequest/RequestRejectModal.jsx
@@ -2,6 +2,7 @@ import {
Box,
Button,
FormControl,
+ FormHelperText,
FormLabel,
Input,
Modal,
@@ -24,8 +25,18 @@ import { useDepositRejectMutation } from "../../../Services/deposit.request.serv
import ToastBox from "../../../Components/ToastBox";
import { useRejectCommentMutation } from "../../../Services/fawateer.request.service";
+// export const conformModalSchema = yup.object().shape({
+// comments: yup.string().required("Comment is required")
+// .max(200, "Approve Comment cannot be more than 200 characters"),
+// });
+
export const conformModalSchema = yup.object().shape({
- comments: yup.string().required("Comment is required"),
+ // checkerComment: yup.string().required("Comment is required")
+ // .max(50, "Investment name cannot be more than 50 characters"),
+ comments: yup
+ .string()
+ .required("Comment is required")
+ .max(200, "Approve Comment cannot be more than 200 characters"),
});
const RequestRejectModal = ({ isOpen, onClose, firstField ,id}) => {
@@ -36,6 +47,7 @@ const RequestRejectModal = ({ isOpen, onClose, firstField ,id}) => {
const {
register,
reset,
+ watch,
handleSubmit,
formState: { errors },
} = useForm({
@@ -108,7 +120,7 @@ const RequestRejectModal = ({ isOpen, onClose, firstField ,id}) => {
reset()
onClose()
}
-
+
return (
@@ -133,12 +145,17 @@ const RequestRejectModal = ({ isOpen, onClose, firstField ,id}) => {
placeholder={"Enter your comments...."}
rounded={"md"}
resize={"none"}
+ maxLength={200}
/>
{errors.comments && (
{errors.comments.message}
)}
+
+ Maximum length should be 200 characters. You have entered
+ {watch("comments")?.length || 0} characters.
+
From 066e2fc1693064da79b1f3c082cffe92429306be Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Mon, 20 Jan 2025 17:26:42 +0530
Subject: [PATCH 39/50] =?UTF-8?q?[=20bud=20update=20=F0=9F=94=A5=20]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Layout/DefaultLayout.jsx | 14 +++++++-------
src/Pages/AccountDeletion/DeletionRequest.jsx | 16 ++++++++--------
.../AccountDeletion/DeletionRequestApprove.jsx | 2 +-
3 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/src/Layout/DefaultLayout.jsx b/src/Layout/DefaultLayout.jsx
index c5475bc..23639f0 100644
--- a/src/Layout/DefaultLayout.jsx
+++ b/src/Layout/DefaultLayout.jsx
@@ -259,21 +259,21 @@ const DashboardLayout = ({ isOnline }) => {
return (
- Withdrawal pending request
+ Withdrawal Pending Request
);
case path.startsWith("/withdraw-history"):
return (
- Withdrawal request
+ Withdrawal Request
);
case path.startsWith("/investor-request"):
return (
- Investor pending request
+ Investor Pending Request
);
case path.startsWith("/investor-history"):
@@ -287,14 +287,14 @@ const DashboardLayout = ({ isOnline }) => {
return (
- Deletion pending request
+ Deletion Pending Request
);
case path.startsWith("/deletion-history"):
return (
- Deletion request
+ Deletion Request
);
@@ -366,7 +366,7 @@ const DashboardLayout = ({ isOnline }) => {
return (
- Deletion pending request
+ Deletion Pending Request
);
case path.startsWith("/deletion-history"):
@@ -380,7 +380,7 @@ const DashboardLayout = ({ isOnline }) => {
return (
- Deletion pending request
+ Deletion Pending Request
);
case path.startsWith("/deletion-history"):
diff --git a/src/Pages/AccountDeletion/DeletionRequest.jsx b/src/Pages/AccountDeletion/DeletionRequest.jsx
index c4f0f2e..6d6fd0a 100644
--- a/src/Pages/AccountDeletion/DeletionRequest.jsx
+++ b/src/Pages/AccountDeletion/DeletionRequest.jsx
@@ -91,12 +91,12 @@ const DeletionRequest = () => {
// ====================================================[Table Setup]================================================================
const tableHeadRow = [
"Sr No.",
- "Requested on",
+ "Requested On",
"Client ID",
- "First name",
- "Last name",
+ "First Name",
+ "Last Name",
"Country",
- "Phone number",
+ "Phone Number",
"Status",
"Action"
];
@@ -114,7 +114,7 @@ const DeletionRequest = () => {
{index + 1}.
),
- "Requested on": (
+ "Requested On": (
{
{item?.clientId}
),
- "First name": (
+ "First Name": (
{
{/* {formatDate(item.charge)} */}
),
- "Last name": (
+ "Last Name": (
{
),
- "Phone number": (
+ "Phone Number": (
{errors.adminComment && (
From f31b67f676caed969e41df5095a459a75bd81615 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Mon, 20 Jan 2025 18:04:55 +0530
Subject: [PATCH 40/50] Enhance comment validation in deletion request approval
and refactor code for clarity
---
.../DeletionRequestApprove.jsx | 141 ++++++++++--------
.../WithDrawal/DrawalView/ViewHistory.jsx | 2 +-
2 files changed, 77 insertions(+), 66 deletions(-)
diff --git a/src/Pages/AccountDeletion/DeletionRequestApprove.jsx b/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
index 1e72564..639ba94 100644
--- a/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
+++ b/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
@@ -21,32 +21,48 @@ import React, { useEffect, useState } from "react";
import * as yup from "yup";
import { yupResolver } from "@hookform/resolvers/yup";
import { useForm } from "react-hook-form";
-import { useGetDepositRequestByIdQuery, useGetDepositRequestQuery, useUpdateDepositRequestMutation } from "../../Services/deposit.request.service";
+import {
+ useGetDepositRequestByIdQuery,
+ useGetDepositRequestQuery,
+ useUpdateDepositRequestMutation,
+} from "../../Services/deposit.request.service";
import FullscreenLoaders from "../../Components/Loaders/FullscreenLoaders";
import ToastBox from "../../Components/ToastBox";
import { useGetDrawalRequestQuery } from "../../Services/drawal.request.service";
-import { useApproveDepositRequestMutation, useGetDeleteRequestByIdQuery } from "../../Services/delete.request.service";
+import {
+ useApproveDepositRequestMutation,
+ useGetDeleteRequestByIdQuery,
+} from "../../Services/delete.request.service";
const FILE_TYPES = ["image/jpeg", "image/png", "image/gif"];
export const conformModalSchema = yup.object().shape({
- adminComment: yup.string().notRequired(),
+ adminComment: yup
+ .string()
+ .min(2, "Comment contain at least 2 character")
+ .max(150, "Comment contain at less then 150 character")
+ .notRequired(),
});
-const DeletionRequestApprove = ({ isOpen, onClose, firstField, id, data:requestData }) => {
- const toast = useToast()
+const DeletionRequestApprove = ({
+ isOpen,
+ onClose,
+ firstField,
+ id,
+ data: requestData,
+}) => {
+ const toast = useToast();
const [file, setFile] = useState();
- const [isBtnLoading , setIsBtnLoading] = useState(false)
- const [isBtnLoadingReject , setIsBtnLoadingReject] = useState(false)
- const [isReject , setIsReject] = useState(false)
+ const [isBtnLoading, setIsBtnLoading] = useState(false);
+ const [isBtnLoadingReject, setIsBtnLoadingReject] = useState(false);
+ const [isReject, setIsReject] = useState(false);
- const fileredData = requestData?.find((item)=> item?.id === id)
- const [ updateApproveRequest ] = useApproveDepositRequestMutation()
- const { data, isLoading } = useGetDeleteRequestByIdQuery(id, {
+ const fileredData = requestData?.find((item) => item?.id === id);
+ const [updateApproveRequest] = useApproveDepositRequestMutation();
+ const { data, isLoading } = useGetDeleteRequestByIdQuery(id, {
skip: !id,
});
-
const {
register,
reset,
@@ -58,51 +74,38 @@ const DeletionRequestApprove = ({ isOpen, onClose, firstField, id, data:requestD
useEffect(() => {
reset({
- comment:fileredData?.comment
- })
-
-
- }, [requestData, id])
-
- const onSubmit = async(data) => {
- setIsBtnLoading(isReject?false:true)
- setIsBtnLoadingReject(isReject)
+ comment: fileredData?.comment,
+ });
+ }, [requestData, id]);
+
+ const onSubmit = async (data) => {
+ setIsBtnLoading(isReject ? false : true);
+ setIsBtnLoadingReject(isReject);
const approveReq = {
- adminComment:data?.adminComment,
- deletionStatus: isReject?"Reject": "Approved"
- }
+ adminComment: data?.adminComment,
+ deletionStatus: isReject ? "Reject" : "Approved",
+ };
- try {
- const res = await updateApproveRequest({ id ,data:approveReq })
-
-
- if (res?.error) {
- toast({
- render: () => (
-
- ),
- });
- heandleOnClose()
- }else if(res?.data?.statusCode === 200) {
- toast({
- render: () => (
-
- ),
- });
- heandleOnClose()
- }
-
- } catch (error) {
-
- }
+ try {
+ const res = await updateApproveRequest({ id, data: approveReq });
+ if (res?.error) {
+ toast({
+ render: () => (
+
+ ),
+ });
+ heandleOnClose();
+ } else if (res?.data?.statusCode === 200) {
+ toast({
+ render: () => ,
+ });
+ heandleOnClose();
+ }
+ } catch (error) {}
};
- const onReject = () => {
-
- }
-
-
+ const onReject = () => {};
useEffect(() => {
if (data) {
@@ -112,16 +115,20 @@ const DeletionRequestApprove = ({ isOpen, onClose, firstField, id, data:requestD
}
}, [data, reset]);
- const heandleOnClose = () =>{
- reset()
- onClose()
- setIsBtnLoading(false)
- setIsReject(false)
- setIsBtnLoadingReject(false)
- }
+ const heandleOnClose = () => {
+ reset();
+ onClose();
+ setIsBtnLoading(false);
+ setIsReject(false);
+ setIsBtnLoadingReject(false);
+ };
return (
-
+
@@ -133,7 +140,10 @@ const DeletionRequestApprove = ({ isOpen, onClose, firstField, id, data:requestD
- Investor Comment {fileredData?.currencyCode}
+
+ Investor Comment{" "}
+ {fileredData?.currencyCode}
+
{/*
Admin Comment
@@ -180,8 +191,8 @@ const DeletionRequestApprove = ({ isOpen, onClose, firstField, id, data:requestD
type="submit"
size={"sm"}
rounded={"sm"}
- variant={'ghost'}
- onClick={()=> setIsReject(true)}
+ variant={"ghost"}
+ onClick={() => setIsReject(true)}
isLoading={isBtnLoadingReject}
>
Reject
diff --git a/src/Pages/WithDrawal/DrawalView/ViewHistory.jsx b/src/Pages/WithDrawal/DrawalView/ViewHistory.jsx
index a8b8929..83b9f71 100644
--- a/src/Pages/WithDrawal/DrawalView/ViewHistory.jsx
+++ b/src/Pages/WithDrawal/DrawalView/ViewHistory.jsx
@@ -133,7 +133,7 @@ const ViewHistory = () => {
"Status",
];
- const extractedArray = filteredData?.map((item, index) => ({
+ const extractedArray = data?.data?.rows?.map((item, index) => ({
// id: item?.id,
"Sr.no": (
Date: Mon, 20 Jan 2025 18:07:09 +0530
Subject: [PATCH 41/50] Add validation mode to form and adjust comment input
margin
---
src/Pages/AccountDeletion/DeletionRequestApprove.jsx | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/Pages/AccountDeletion/DeletionRequestApprove.jsx b/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
index 639ba94..79d9588 100644
--- a/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
+++ b/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
@@ -70,6 +70,7 @@ const DeletionRequestApprove = ({
formState: { errors },
} = useForm({
resolver: yupResolver(conformModalSchema),
+ mode: "all",
});
useEffect(() => {
@@ -176,6 +177,7 @@ const DeletionRequestApprove = ({
size="sm"
placeholder={"Enter your comment...."}
resize={"none"}
+ mb={2}
/>
{errors.adminComment && (
From efddfe6d7afe2d48c4b881afa187502a17b2c3d5 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Mon, 20 Jan 2025 18:40:20 +0530
Subject: [PATCH 42/50] Fix data extraction in DeletionRequest component to use
correct data structure
---
src/Pages/AccountDeletion/DeletionRequest.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Pages/AccountDeletion/DeletionRequest.jsx b/src/Pages/AccountDeletion/DeletionRequest.jsx
index 6d6fd0a..f90c867 100644
--- a/src/Pages/AccountDeletion/DeletionRequest.jsx
+++ b/src/Pages/AccountDeletion/DeletionRequest.jsx
@@ -101,7 +101,7 @@ const DeletionRequest = () => {
"Action"
];
- const extractedArray = filteredData?.map((item, index) => ({
+ const extractedArray = data?.data?.rows?.map((item, index) => ({
id: item?.id,
"Sr No.": (
Date: Mon, 20 Jan 2025 19:35:58 +0530
Subject: [PATCH 43/50] [ deletion request modal bugs ]
---
.../DeletionRequestApprove.jsx | 20 +++++++++++++++++--
.../ApproveRequest/RequestApproveModal.jsx | 2 +-
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/src/Pages/AccountDeletion/DeletionRequestApprove.jsx b/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
index 1e72564..2ad6c70 100644
--- a/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
+++ b/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
@@ -3,6 +3,7 @@ import {
Box,
Button,
FormControl,
+ FormHelperText,
FormLabel,
Input,
Modal,
@@ -29,8 +30,17 @@ import { useApproveDepositRequestMutation, useGetDeleteRequestByIdQuery } from "
const FILE_TYPES = ["image/jpeg", "image/png", "image/gif"];
+// export const conformModalSchema = yup.object().shape({
+// adminComment: yup.string().notRequired(),
+// });
+
export const conformModalSchema = yup.object().shape({
- adminComment: yup.string().notRequired(),
+ // checkerComment: yup.string().required("Comment is required")
+ // .max(50, "Investment name cannot be more than 50 characters"),
+ adminComment: yup
+ .string()
+ .required("Comment is required")
+ .max(200, "Approve Comment cannot be more than 200 characters"),
});
const DeletionRequestApprove = ({ isOpen, onClose, firstField, id, data:requestData }) => {
@@ -50,6 +60,7 @@ const DeletionRequestApprove = ({ isOpen, onClose, firstField, id, data:requestD
const {
register,
reset,
+ watch,
handleSubmit,
formState: { errors },
} = useForm({
@@ -171,6 +182,10 @@ const DeletionRequestApprove = ({ isOpen, onClose, firstField, id, data:requestD
{errors.adminComment.message}
)}
+
+ Maximum length should be 200 characters. You have entered
+ {watch("adminComment")?.length || 0} characters.
+
@@ -180,9 +195,10 @@ const DeletionRequestApprove = ({ isOpen, onClose, firstField, id, data:requestD
type="submit"
size={"sm"}
rounded={"sm"}
- variant={'ghost'}
+ bg="gray"
onClick={()=> setIsReject(true)}
isLoading={isBtnLoadingReject}
+ fontWeight={500}
>
Reject
diff --git a/src/Pages/FawateerChecker/ApproveRequest/RequestApproveModal.jsx b/src/Pages/FawateerChecker/ApproveRequest/RequestApproveModal.jsx
index 01ed246..a71b932 100644
--- a/src/Pages/FawateerChecker/ApproveRequest/RequestApproveModal.jsx
+++ b/src/Pages/FawateerChecker/ApproveRequest/RequestApproveModal.jsx
@@ -140,7 +140,7 @@ const RequestApproveModal = ({ isOpen, onClose, firstField ,id}) => {
rounded={"md"}
resize={"none"}
maxLength={200}
- />
+ />
{errors.checkerComment && (
{errors.checkerComment.message}
From f2d8aee6a90369ea450afb0e6ddb1192869461ea Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Mon, 20 Jan 2025 20:13:30 +0530
Subject: [PATCH 44/50] Refactor DeletionRequestApprove component to include
refetch functionality and improve error handling
---
.../AccountDeletion/DeletionRequestApprove.jsx | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/Pages/AccountDeletion/DeletionRequestApprove.jsx b/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
index 124ffd2..c29211e 100644
--- a/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
+++ b/src/Pages/AccountDeletion/DeletionRequestApprove.jsx
@@ -33,6 +33,7 @@ import { useGetDrawalRequestQuery } from "../../Services/drawal.request.service"
import {
useApproveDepositRequestMutation,
useGetDeleteRequestByIdQuery,
+ useGetDeleteRequestQuery,
} from "../../Services/delete.request.service";
const FILE_TYPES = ["image/jpeg", "image/png", "image/gif"];
@@ -75,6 +76,8 @@ const DeletionRequestApprove = ({
mode: "all",
});
+ const { refetch } = useGetDeleteRequestQuery();
+
useEffect(() => {
reset({
comment: fileredData?.comment,
@@ -103,9 +106,12 @@ const DeletionRequestApprove = ({
toast({
render: () => ,
});
+ refetch();
heandleOnClose();
}
- } catch (error) {}
+ } catch (error) {
+ console.log(error);
+ }
};
const onReject = () => {};
@@ -187,7 +193,10 @@ const DeletionRequestApprove = ({
)}
- Maximum length should be 200 characters. You have entered
+
+ {" "}
+ Maximum length should be 200 characters. You have entered
+
{watch("adminComment")?.length || 0} characters.
@@ -199,8 +208,8 @@ const DeletionRequestApprove = ({
type="submit"
size={"sm"}
rounded={"sm"}
- variant={'ghost'}
- onClick={()=> setIsReject(true)}
+ variant={"ghost"}
+ onClick={() => setIsReject(true)}
isLoading={isBtnLoadingReject}
fontWeight={500}
>
From 79ec8d92aeb03c79ec7204ac5b7f8de2ffd7b8d3 Mon Sep 17 00:00:00 2001
From: Swapnil Bendal <84583651+Swapnil155@users.noreply.github.com>
Date: Mon, 20 Jan 2025 20:38:52 +0530
Subject: [PATCH 45/50] Implement debounced search functionality in
ApproveHistory component and update API query structure
---
.../ApproveHistory/ApproveHistoryChecker.jsx | 81 +++++++++++--------
src/Services/fawateer.request.service.js | 25 +++---
2 files changed, 63 insertions(+), 43 deletions(-)
diff --git a/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryChecker.jsx b/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryChecker.jsx
index 58d792e..f35f272 100644
--- a/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryChecker.jsx
+++ b/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryChecker.jsx
@@ -37,6 +37,7 @@ const ApproveHistory = () => {
const [actionId, setActionId] = useState(false);
const [mouseEntered, setMouseEntered] = useState(false);
const [mouseEnteredId, setMouseEnteredId] = useState("");
+ const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
@@ -60,14 +61,31 @@ const ApproveHistory = () => {
onClose: onRejectClose,
} = useDisclosure();
+ // 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]);
+
const {
data,
isLoading: drawalRequestLoading,
error,
refetch,
- } = useGetApproveHistoryQuery();
-
- console.log(data?.data?.rows);
+ } = useGetApproveHistoryQuery(
+ {
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+ search: debouncedSearchTerm,
+ },
+ {
+ skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
+ }
+ );
// Use useEffect to refetch data when the component mounts
useEffect(() => {
@@ -172,11 +190,7 @@ const ApproveHistory = () => {
),
"Deposit Date": (
-
+
{formatDate(item?.transaction_date)}
@@ -202,28 +216,27 @@ const ApproveHistory = () => {
fontWeight={"500"}
className="d-flex align-items-center web-text-small"
>
- {item?.spportFile_path&&
-
-
- View
-
-
-
- }
+
+ View
+
+
+
+
+ )}
),
Status: (
@@ -236,12 +249,12 @@ const ApproveHistory = () => {
rounded={4}
colorScheme={
item?.transactionStatus === "Approved"
- ? "green"
- : item?.transactionStatus === "Pending"
- ? "yellow"
- : item?.transactionStatus === "Reject"
- ? "red"
- : "gray" // default border color if status doesn't match any condition
+ ? "green"
+ : item?.transactionStatus === "Pending"
+ ? "yellow"
+ : item?.transactionStatus === "Reject"
+ ? "red"
+ : "gray" // default border color if status doesn't match any condition
}
>
{item.transactionStatus}
diff --git a/src/Services/fawateer.request.service.js b/src/Services/fawateer.request.service.js
index 1a5e90a..06338e2 100644
--- a/src/Services/fawateer.request.service.js
+++ b/src/Services/fawateer.request.service.js
@@ -9,7 +9,7 @@ import { baseQuery } from "./token.serivce";
export const fawateerRequest = createApi({
reducerPath: "fawateerRequest",
baseQuery: baseQuery,
- tagTypes: ["getFawateerRequest" ,"getApproveHistory","getApproveComment","getRejectComment","getFawateerMakerRequest"],
+ tagTypes: ["getFawateerRequest", "getApproveHistory", "getApproveComment", "getRejectComment", "getFawateerMakerRequest"],
endpoints: (builder) => ({
@@ -37,7 +37,7 @@ export const fawateerRequest = createApi({
}),
-
+
getFawateerForMakerRequest: builder.query({
query: ({ page, size, searchTerm }) => {
@@ -51,7 +51,14 @@ export const fawateerRequest = createApi({
}),
getApproveHistory: builder.query({
- query: () => `/fawateer/admin/getAll`,
+ query: ({ page, size, searchTerm }) => {
+ let baseURL = `/fawateer/admin/getAll?search=${searchTerm || ""}`;
+ if (page !== undefined && size !== undefined) {
+ baseURL += `&page=${page}&size=${size}`; // Only add pagination if both are defined
+ }
+ return baseURL;
+
+ },
providesTags: ["getApproveHistory"],
}),
@@ -78,10 +85,10 @@ export const fawateerRequest = createApi({
// Export hooks for usage in functional components
export const {
- useGetFawateerRequestQuery,
- useGetApproveHistoryQuery,
- useApproveCommentMutation,
- useRejectCommentMutation,
- useGetFawateerForMakerRequestQuery,
- useGetFawateerInvestorsQuery
+ useGetFawateerRequestQuery,
+ useGetApproveHistoryQuery,
+ useApproveCommentMutation,
+ useRejectCommentMutation,
+ useGetFawateerForMakerRequestQuery,
+ useGetFawateerInvestorsQuery
} = fawateerRequest;
From 49b06e81a6572d9eca1c00f55b79b841fe79b36f Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Tue, 21 Jan 2025 12:42:02 +0530
Subject: [PATCH 46/50] [ Add ISDcode ]
---
src/Pages/BankDepositRequest/BankDepositRequest.jsx | 3 ++-
src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/Pages/BankDepositRequest/BankDepositRequest.jsx b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
index bfd1f3e..8173965 100644
--- a/src/Pages/BankDepositRequest/BankDepositRequest.jsx
+++ b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
@@ -221,7 +221,8 @@ const BankDepositRequest = () => {
"Phone Number": (
- {item?.mobileNumber}
+ {/* {item?.mobileNumber} */}
+ {item?.ISDcode + " " + item?.mobileNumber}
),
diff --git a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
index 243ee7c..f038e2e 100644
--- a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
+++ b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
@@ -188,7 +188,8 @@ const ReversalFawateerDeposit = () => {
"Phone Number": (
- {item?.principal?.mobileNumber}
+ {/* {item?.principal?.ISDcode} {item?.principal?.mobileNumber} */}
+ {item?.principal?.ISDcode + " " + item?.principal?.mobileNumber}
),
From 8587b91a335033484012f413b3e90f0e61ab01be Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Tue, 21 Jan 2025 15:15:48 +0530
Subject: [PATCH 47/50] change Reversal heading
---
src/Layout/DefaultLayout.jsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Layout/DefaultLayout.jsx b/src/Layout/DefaultLayout.jsx
index 23639f0..f799b27 100644
--- a/src/Layout/DefaultLayout.jsx
+++ b/src/Layout/DefaultLayout.jsx
@@ -309,14 +309,14 @@ const DashboardLayout = ({ isOnline }) => {
return (
- Fawateer Deposit
+ Reversal Transaction / Fawateer Deposit
);
case path.startsWith("/account-deletion-request"):
return (
- Account Deletion Request
+ Reversal Transaction / Account Deletion Request
);
From f4a2fd2889b72692a97526ff94458daa191d09e9 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Tue, 21 Jan 2025 16:25:38 +0530
Subject: [PATCH 48/50] [ update amount reseversl ]
---
.../BankDepositRequest/BankDepositRequest.jsx | 22 +++++++++++++++----
.../ReversalFawateerDeposit.jsx | 14 ++++++++++++
2 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/src/Pages/BankDepositRequest/BankDepositRequest.jsx b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
index 8173965..8c9d4ae 100644
--- a/src/Pages/BankDepositRequest/BankDepositRequest.jsx
+++ b/src/Pages/BankDepositRequest/BankDepositRequest.jsx
@@ -117,6 +117,7 @@ const BankDepositRequest = () => {
"Last Name",
"Country",
"Phone Number",
+ "Deposit Amount",
"Action",
];
@@ -212,17 +213,30 @@ const BankDepositRequest = () => {
),
Country: (
-
+
{item?.countryName}
),
"Phone Number": (
-
+
- {/* {item?.mobileNumber} */}
- {item?.ISDcode + " " + item?.mobileNumber}
+ {item?.ISDCode} {item?.mobileNumber}
+ {/* {item?.ISDcode + " " + item?.mobileNumber} */}
+
+
+ ),
+ "Deposit Amount": (
+
+
+ {parseFloat(item?.investorAmount || 0).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}
+
+ {item?.currencyCode}
+
),
diff --git a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
index f038e2e..6eb8c3c 100644
--- a/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
+++ b/src/Pages/ReversalFawateerDeposit/ReversalFawateerDeposit.jsx
@@ -130,6 +130,7 @@ const ReversalFawateerDeposit = () => {
"First Name",
"Last Name",
"Phone Number",
+ "Deposit Amount (BHD)",
"Action",
];
@@ -193,6 +194,19 @@ const ReversalFawateerDeposit = () => {
),
+ "Deposit Amount (BHD)": (
+
+
+ {parseFloat(item?.transaction_details?.investorAmount || 0).toLocaleString(undefined, {
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ })}
+
+ {item?.currencyCode}
+
+
+
+ ),
Action: (
Date: Tue, 21 Jan 2025 16:42:57 +0530
Subject: [PATCH 49/50] [ Approve Historty maker search ]
---
.../ApproveHistory/ApproveHistoryChecker.jsx | 23 +++++++++++++++++--
.../ApproveHistory/ApproveHistoryMaker.jsx | 2 +-
src/Services/fawateer.request.service.js | 15 ++++++++++--
3 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryChecker.jsx b/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryChecker.jsx
index 58d792e..b1286e5 100644
--- a/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryChecker.jsx
+++ b/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryChecker.jsx
@@ -37,6 +37,7 @@ const ApproveHistory = () => {
const [actionId, setActionId] = useState(false);
const [mouseEntered, setMouseEntered] = useState(false);
const [mouseEnteredId, setMouseEnteredId] = useState("");
+ const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
@@ -65,7 +66,16 @@ const ApproveHistory = () => {
isLoading: drawalRequestLoading,
error,
refetch,
- } = useGetApproveHistoryQuery();
+ } = useGetApproveHistoryQuery(
+ {
+ page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search
+ size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search
+ searchTerm: debouncedSearchTerm,
+ },
+ {
+ skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
+ }
+ );
console.log(data?.data?.rows);
@@ -84,6 +94,15 @@ const ApproveHistory = () => {
return () => clearTimeout(timer);
}, []);
+
+ useEffect(() => {
+ const handler = setTimeout(() => {
+ setDebouncedSearchTerm(searchTerm);
+ }, 500); // Adjust delay as needed
+ return () => {
+ clearTimeout(handler);
+ };
+ }, [searchTerm]);
// ====================================================[Table Filter]================================================================
const filteredData = data?.data?.rows?.filter((item) => {
// Filter by name (case insensitive)
@@ -117,7 +136,7 @@ const ApproveHistory = () => {
"Status",
];
- const extractedArray = filteredData?.map((item, idx) => ({
+ const extractedArray = data?.data?.rows?.map((item, idx) => ({
// id: item?.id,
"Sr.no": (
{
skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
}
);
-
+
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedSearchTerm(searchTerm);
diff --git a/src/Services/fawateer.request.service.js b/src/Services/fawateer.request.service.js
index 1a5e90a..2d5a79c 100644
--- a/src/Services/fawateer.request.service.js
+++ b/src/Services/fawateer.request.service.js
@@ -50,8 +50,19 @@ export const fawateerRequest = createApi({
providesTags: ["getFawateerMakerRequest"],
}),
+ // getApproveHistory: builder.query({
+ // query: () => `/fawateer/admin/getAll`,
+ // providesTags: ["getApproveHistory"],
+ // }),
+
getApproveHistory: builder.query({
- query: () => `/fawateer/admin/getAll`,
+ query: ({ page, size, searchTerm }) => {
+ let baseURL = `/fawateer/admin/getAll?search=${searchTerm || ""}`;
+ if (page !== undefined && size !== undefined) {
+ baseURL += `&page=${page}&size=${size}`; // Only add pagination if both are defined
+ }
+ return baseURL;
+ },
providesTags: ["getApproveHistory"],
}),
@@ -72,7 +83,7 @@ export const fawateerRequest = createApi({
}),
invalidatesTags: ["getFawateerRequest"],
}),
-
+
}),
});
From 04a5d1280f454867ad68613afd6b17c7807dda01 Mon Sep 17 00:00:00 2001
From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com>
Date: Tue, 21 Jan 2025 16:44:01 +0530
Subject: [PATCH 50/50] approve history maker [ Search ]
---
.../FawateerChecker/ApproveHistory/ApproveHistoryMaker.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryMaker.jsx b/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryMaker.jsx
index 7f3de1a..b2e2739 100644
--- a/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryMaker.jsx
+++ b/src/Pages/FawateerChecker/ApproveHistory/ApproveHistoryMaker.jsx
@@ -92,7 +92,7 @@ const ApproveHistoryMaker = () => {
skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
}
);
-
+
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedSearchTerm(searchTerm);