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)} /> - - - - - -{/* + {/* */} - @@ -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;