From 2e795ece53d2fd3f23d32be8a0564335b474332d Mon Sep 17 00:00:00 2001 From: ardiola Date: Fri, 11 Apr 2025 22:27:58 +0700 Subject: [PATCH 01/12] Add ResendTransaction component Add resend button in transactioncontext --- .gitignore | 3 + package-lock.json | 5 + package.json | 1 + .../blocks/ResendTransaction.tsx | 183 ++++++++++++ .../hooks/TransactionContext.tsx | 37 ++- yarn.lock | 269 ++++++++++++++++++ 6 files changed, 495 insertions(+), 3 deletions(-) create mode 100644 src/pages/transaction/history-transaction/blocks/ResendTransaction.tsx diff --git a/.gitignore b/.gitignore index cff2732..a93a63a 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ yarn.lock .env package-lock.json +package.json +yarn.lock +package-lock.json diff --git a/package-lock.json b/package-lock.json index 87756c1..3e4da0b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,6 +49,7 @@ "https": "^1.0.0", "leaflet": "^1.9.4", "lucide-react": "^0.456.0", + "metronic-tailwind-react": "file:", "mini-svg-data-uri": "^1.4.4", "moment": "^2.30.1", "next-themes": "^0.4.3", @@ -6454,6 +6455,10 @@ "node": ">= 8" } }, + "node_modules/metronic-tailwind-react": { + "resolved": "", + "link": true + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", diff --git a/package.json b/package.json index 2e30fa9..7745b80 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "https": "^1.0.0", "leaflet": "^1.9.4", "lucide-react": "^0.456.0", + "metronic-tailwind-react": "file:", "mini-svg-data-uri": "^1.4.4", "moment": "^2.30.1", "next-themes": "^0.4.3", diff --git a/src/pages/transaction/history-transaction/blocks/ResendTransaction.tsx b/src/pages/transaction/history-transaction/blocks/ResendTransaction.tsx new file mode 100644 index 0000000..3e68622 --- /dev/null +++ b/src/pages/transaction/history-transaction/blocks/ResendTransaction.tsx @@ -0,0 +1,183 @@ +import { useTransactionContext } from '../hooks/useTransactionContext'; +import { useCallApi } from '@/hooks'; +import { apiConfig } from '@/config/api.config'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import { + Dialog, + DialogBody, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle +} from '@/components/ui/dialog'; +import { Button } from '@/components/ui/button'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue +} from '@/components/ui/select'; +import { Alert, KeenIcon, useDataGrid } from '@/components'; +import { doSaveLogActivity } from '@/actions/GlobalActions'; +import { toast } from 'sonner'; +import { Input } from '@/components/ui/input'; + +const API_URL = apiConfig.transaction; + +const ResendTransaction = () => { + const { GetData, PostData } = useCallApi(); + // const { reload } = useDataGrid(); + const { + showResendDialog, + setShowResendDialog, + selectedTransactionRowForResend + } = useTransactionContext(); + + // const [transactionDetails, setTransactionDetails] = useState(null); + + // const [formField, setFormField] = useState({ + // transaction_code: '', + // status: '' + // }); + + console.log('selectedTransactionRowForResend', selectedTransactionRowForResend); + + const [alert, setAlert] = useState({ + show: false, + message: '' + }); + + // const doApproval = useCallback( + // async (e: React.FormEvent) => { + // e.preventDefault(); + + // if (!transactionDetails || !transactionDetails.code) { + // toast.error('Transaction data not loaded yet.'); + // return; + // } + + // if (!formField.status) { + // toast.error('Please select a status.'); + // return; + // } + + // const response = await PostData(`${API_URL}/transaction/set-approval`, { + // transaction_code: transactionDetails.code, + // status: formField.status, + // }); + + // if (response?.status) { + // setAlert((prev) => ({ ...prev, show: false, message: '' })); + // toast.success('Success Update Position'); + // const createActivity = { + // module: 'Approval Transaction', + // description: `Change status approve for transaction => ${transactionDetails.code}`, + // action: 'U' + // }; + // doSaveLogActivity(createActivity); + // setShowApprovalDialog(false); // optionally close dialog + // } else { + // setAlert((prev) => ({ ...prev, show: true, message: response?.message })); + // } + // }, + // [formField, transactionDetails] + // ); + + // useEffect(() => { + // const fetchTransactionDetails = async () => { + // if (selectedTransactionIdForApproval) { + // try { + // const response = await GetData(`${API_URL}/transaction/history/detail/${selectedTransactionIdForApproval}`, { + // id: selectedTransactionIdForApproval + // }); + // // console.log(response?.data.code); + // // console.log(selectedTransactionIdForApproval); + // setTransactionDetails(response?.data); + // } catch (error) { + // console.error('Error fetching transaction', error); + // } + // } + // }; + + // if (showApprovalDialog && selectedTransactionIdForApproval) { + // fetchTransactionDetails(); + // } + // }, [showApprovalDialog, selectedTransactionIdForApproval, GetData]); + + return ( + setShowResendDialog(open)}> + + + + + +

Are you sure?

+ You will resend this failed transaction! +
+ {alert.show && ( + +

{alert.message}

+
+ )} +
+ + + + +
+
+ ); + + // return ( + // + // + // + // Resend Transaction + // + // + //

tes dialog

+ // {/*
+ //
+ //
+ //
+ // + + //
+ // + //
+ //
+ //
+ + + //
+ //
+ // + //
+ //
+ //
*/} + //
+ //
+ //
+ // ); +}; + +export default ResendTransaction; diff --git a/src/pages/transaction/history-transaction/hooks/TransactionContext.tsx b/src/pages/transaction/history-transaction/hooks/TransactionContext.tsx index 5e28d8f..ca7b179 100644 --- a/src/pages/transaction/history-transaction/hooks/TransactionContext.tsx +++ b/src/pages/transaction/history-transaction/hooks/TransactionContext.tsx @@ -9,6 +9,8 @@ import ListToolbar from '../blocks/ListToolbar'; import { Button } from '@/components/ui/button'; import { useNavigate } from 'react-router'; import DetailTransaction from '../blocks/DetailTransaction'; +import { log } from 'console'; +import ResendTransaction from '../blocks/ResendTransaction'; interface TransactionProps { id: number; @@ -28,6 +30,10 @@ interface ContextProps { setShowDetailDialog: React.Dispatch>; selectedTransactionId: number | null; setSelectedTransactionId: React.Dispatch>; + showResendDialog: boolean; + setShowResendDialog: React.Dispatch>; + selectedTransactionRowForResend: any | null; + setTransactionRowForResend: React.Dispatch>; } const initialProps: ContextProps = { @@ -35,7 +41,11 @@ const initialProps: ContextProps = { showDetailDialog: false, setShowDetailDialog: () => { }, selectedTransactionId: null, - setSelectedTransactionId: () => { } + setSelectedTransactionId: () => { }, + showResendDialog: false, + setShowResendDialog: () => { }, + selectedTransactionRowForResend: null, + setTransactionRowForResend: () => { } }; const ManageTransactionContext = createContext(initialProps); @@ -50,6 +60,8 @@ const TransactionProvider = ({ children }: { children: React.ReactNode }) => { const handleNavigate = (path: string) => { const url = navigate(`${API_URL}/transaction/history/${path}`); }; + const [showResendDialog, setShowResendDialog] = useState(false); + const [selectedTransactionRowForResend, setTransactionRowForResend] = useState(null); const columns = useMemo[]>( () => [ @@ -84,7 +96,7 @@ const TransactionProvider = ({ children }: { children: React.ReactNode }) => { }); return formattedDateTime; // Format DD-MM-YYYY HH:MM:SS (menggunakan waktu yang sudah ada) } - }, + }, { accessorKey: 'origin_customer.fullname', header: ({ column }) => , @@ -171,6 +183,7 @@ const TransactionProvider = ({ children }: { children: React.ReactNode }) => { enableHiding: false, cell: (data) => { const row = data.row.original; + const isVisible = row.status === 'F' ? true : false || row.status === 'P' ? true : false; return (
+ {/* add new button for resend transaction failed */} + {isVisible && + + }
); }, @@ -241,11 +267,16 @@ const TransactionProvider = ({ children }: { children: React.ReactNode }) => { showDetailDialog, setShowDetailDialog, selectedTransactionId, - setSelectedTransactionId + setSelectedTransactionId, + showResendDialog, + setShowResendDialog, + selectedTransactionRowForResend, + setTransactionRowForResend }} > + Date: Tue, 15 Apr 2025 16:24:59 +0700 Subject: [PATCH 02/12] fix master area --- .../manage-members/blocks/DetailMember.tsx | 71 ++++++------------- 1 file changed, 23 insertions(+), 48 deletions(-) diff --git a/src/pages/members/manage-members/blocks/DetailMember.tsx b/src/pages/members/manage-members/blocks/DetailMember.tsx index 4eac2e1..9852562 100644 --- a/src/pages/members/manage-members/blocks/DetailMember.tsx +++ b/src/pages/members/manage-members/blocks/DetailMember.tsx @@ -65,13 +65,13 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa setNationality(getNationality.data.data) setFormData({ ...formData, [name]: value }); } else { + if (name === 'municipio_id' || name === 'posto_adms_id' || name === 'suco_id') await getMasterAfter(name, value); setFormData({ ...formData, [name]: value }); - if (name === 'municipio' || name === 'posto_adms' || name === 'suco') await getMasterAfter(name, value); } }; async function getMasterAfter(name: string, id: any) { - if (name === 'municipio') { + if (name === 'municipio_id') { let getMunicipiosPosto = await axios.get(`${BASE_URL_MASTER_DATA}/municipios/postoadms/${id}`, { params: { limit: 50, @@ -83,7 +83,7 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa }); setPostoAdm(getMunicipiosPosto.data.data) } - if (name === 'posto_adms') { + if (name === 'posto_adms_id') { let getPostoSuco = await axios.get(`${BASE_URL_MASTER_DATA}/postoadms/sucos/${id}`, { params: { limit: 50, @@ -95,7 +95,7 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa }); setSucos(getPostoSuco.data.data) } - if (name === 'suco') { + if (name === 'suco_id') { let getSucoAldeias = await axios.get(`${BASE_URL_MASTER_DATA}/sucos/aldeias/${id}`, { params: { limit: 50, @@ -130,46 +130,21 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa } }); setGroups(getGroups.data.data.list); - // let getMunicipios = await axios.get(`${BASE_URL_MASTER_DATA}/municipios/list`, { - // params: { - // limit: 50, - // page: 1, - // with_deleted: false, - // order_field: 'name', - // order_direction: 'ASC', - // } - // }); - // setMunicipios(getMunicipios.data.data.list) - // let getPostoAdms = await axios.get(`${BASE_URL_MASTER_DATA}/postoadms/list`, { - // params: { - // limit: 50, - // page: 1, - // with_deleted: false, - // order_field: 'name', - // order_direction: 'ASC', - // } - // }); - // setPostoAdm(getPostoAdms.data.data.list) - // let getSucos = await axios.get(`${BASE_URL_MASTER_DATA}/sucos/list`, { - // params: { - // limit: 50, - // page: 1, - // with_deleted: false, - // order_field: 'name', - // order_direction: 'ASC', - // } - // }); - // setSucos(getSucos.data.data.list) - // let getAldeias = await axios.get(`${BASE_URL_MASTER_DATA}/aldeias/list`, { - // params: { - // limit: 50, - // page: 1, - // with_deleted: false, - // order_field: 'name', - // order_direction: 'ASC', - // } - // }); - // setAldeias(getAldeias.data.data.list) + + let getMunicipios = await axios.get(`${BASE_URL_MASTER_DATA}/municipios/list`, { + params: { + limit: 70, + page: 1, + with_deleted: false, + order_field: 'name', + order_direction: 'ASC', + } + }); + setMunicipios(getMunicipios.data.data.list) + if (formData.municipio_id) await handleChange({target: { name: "municipio_id",value: formData.municipio_id }}); + if (formData.posto_adms_id) await handleChange({target: { name: "posto_adms_id",value: formData.posto_adms_id }}); + if (formData.suco_id) await handleChange({target: { name: "suco_id",value: formData.suco_id }}); + if (formData.aldeia_id) await handleChange({target: { name: "aldeia_id",value: formData.aldeia_id }}); } catch (error:any) { console.log(error); toast.error(error.message) @@ -234,10 +209,10 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Email', 'email', 'text', true, viewOnly): ''} {/* {generateList(formData, handleChange, status, 'status', 'Status', null, true)} */} {(formData.id || dialogType === "create") ? generateList(formData, handleChange, profession, 'profession', 'Profession', false, false): ''} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, municipios, 'municipio', 'Municipio', false, false): ''} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, postoAdm, 'posto_adms', 'Posto', false, false): ''} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, sucos, 'suco', 'Suco', false, false): ''} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, aldeias, 'aldeia', 'Aldeia', false, false): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, municipios, 'municipio_id', 'Municipio', false, false): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, postoAdm, 'posto_adms_id', 'Posto', false, false): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, sucos, 'suco_id', 'Suco', false, false): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, aldeias, 'aldeia_id', 'Aldeia', false, false): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Nationality', 'nationality', 'text', true, viewOnly): ''}
From d78805dbce1aa03a19ec7661a76332f47ce33d21 Mon Sep 17 00:00:00 2001 From: Wikzyy Date: Tue, 15 Apr 2025 17:23:01 +0700 Subject: [PATCH 03/12] update table on upgrade member kyc --- src/pages/members/kyc/Columns.tsx | 171 +++++++++++----- src/pages/members/kyc/Kyc.tsx | 201 ++++++++++--------- src/pages/members/kyc/blocks/AddDialog.tsx | 14 -- src/pages/members/kyc/blocks/ListToolBar.tsx | 1 - 4 files changed, 225 insertions(+), 162 deletions(-) delete mode 100644 src/pages/members/kyc/blocks/AddDialog.tsx diff --git a/src/pages/members/kyc/Columns.tsx b/src/pages/members/kyc/Columns.tsx index 541ac16..55d3d28 100644 --- a/src/pages/members/kyc/Columns.tsx +++ b/src/pages/members/kyc/Columns.tsx @@ -1,3 +1,4 @@ +import { DataGridColumnHeader, KeenIcon } from '@/components'; import { Button } from '@/components/ui/button'; import { DropdownMenu, @@ -18,7 +19,7 @@ export type Members = { created_at: Date; }; -export const columns: ColumnDef[] = [ +export const getColumns = (handleUpdate: (data: any) => void): ColumnDef[] => [ { accessorKey: 'no', header: ({ column }) => { @@ -31,6 +32,14 @@ export const columns: ColumnDef[] = [ ); + }, + cell: ({ row, table }) => { + const pageIndex = table.getState().pagination.pageIndex; + const pageSize = table.getState().pagination.pageSize; + const rowIndex = row.index; + + const number = pageIndex * pageSize + rowIndex + 1; + return number; } }, { @@ -136,61 +145,117 @@ export const columns: ColumnDef[] = [ id: 'actions', cell: ({ row }) => { const dataMembers = row.original; + return ( - - + ); } } ]; -export const initialMember = { - id: "", - fullname: "", - email: "", - username: "", - msisdn: "", - password: "", - pin: "", - try_pin: "", - mother_fullname: "", - agent_name: "", - bank_name: "", - bank_account: "", - ibank_number: "", - address: "", - longitude: "", - latitude: "", - nationality: "", - photouser: "", - photomerchant: "", - file_selfie: "", - file_document_id: "", - file_document_id_selfie: "", - file_commercial_license: "", - identity_type: "", - identity_number: "", - license_number: "", - date_birth: "", - gender: "", - status: "N", - isneedapproval: "", - isapproved: "", - approveddate: "", - approvedby: "", - created_by: "", - created_at: "", - updated_by: "", - updated_at: "", - deleted_by: "", - deleted_at: "", - group: "", - point_tier: "", - language: "", - municipio: "", - posto_adms: "", - suco: "", - aldeia: "", - profession: "", - description: "" -} +export type MembersProps = { + id: string; + fullname: string; + email: string; + username: string; + msisdn: string; + password: string; + pin: string; + try_pin: string; + mother_fullname: string; + agent_name: string; + bank_name: string; + bank_account: string; + ibank_number: string; + address: string; + longitude: string; + latitude: string; + nationality: string; + photouser: string; + photomerchant: string; + file_selfie: string; + file_document_id: string; + file_document_id_selfie: string; + file_commercial_license: string; + identity_type: string; + identity_number: string; + license_number: string; + date_birth: string; + gender: string; + status: string; + isneedapproval: string; + isapproved: string; + approveddate: string; + approvedby: string; + created_by: string; + created_at: string; + updated_by: string; + updated_at: string; + deleted_by: string; + deleted_at: string; + group: string; + point_tier: string; + language: string; + municipio: string; + posto_adms: string; + suco: string; + aldeia: string; + profession: string; + description: string; +}; + +export const initialMember: MembersProps = { + id: '', + fullname: '', + email: '', + username: '', + msisdn: '', + password: '', + pin: '', + try_pin: '', + mother_fullname: '', + agent_name: '', + bank_name: '', + bank_account: '', + ibank_number: '', + address: '', + longitude: '', + latitude: '', + nationality: '', + photouser: '', + photomerchant: '', + file_selfie: '', + file_document_id: '', + file_document_id_selfie: '', + file_commercial_license: '', + identity_type: '', + identity_number: '', + license_number: '', + date_birth: '', + gender: '', + status: 'N', + isneedapproval: '', + isapproved: '', + approveddate: '', + approvedby: '', + created_by: '', + created_at: '', + updated_by: '', + updated_at: '', + deleted_by: '', + deleted_at: '', + group: '', + point_tier: '', + language: '', + municipio: '', + posto_adms: '', + suco: '', + aldeia: '', + profession: '', + description: '' +}; diff --git a/src/pages/members/kyc/Kyc.tsx b/src/pages/members/kyc/Kyc.tsx index b3ecff9..b27ce0f 100644 --- a/src/pages/members/kyc/Kyc.tsx +++ b/src/pages/members/kyc/Kyc.tsx @@ -1,9 +1,9 @@ -import { DataGridInner, TDataGridProps } from '@/components'; +import { Container, DataGridInner, DataGridProvider, TDataGridProps } from '@/components'; import { DataTable } from '@/components/ui/DataTable'; import { Table } from '@tanstack/react-table'; import React, { createContext, useContext, useState, useEffect } from 'react'; import { ManageKycContextProvider } from './hooks'; -import { columns, initialMember } from './Columns'; +import { getColumns, initialMember } from './Columns'; import { useAuthContext } from '@/auth'; import { LoaderTransparant } from '@/components'; import { apiConfig } from '@/config/api.config'; @@ -16,25 +16,7 @@ const BASE_URL_MASTER_DATA = apiConfig.service_master_data; import DetailMember from '../manage-members/blocks/DetailMember'; import { Breadcrumbs, Link } from '@mui/material'; import { Helmet } from 'react-helmet'; - -export interface IDataGridContextProps { - props: TDataGridProps; - table: Table; - totalRows: number; - loading: (state: boolean) => void; - reload: () => void; - children?: React.ReactNode; -} - -const DataGridContext = createContext | undefined>(undefined); - -export const useDataGrid = () => { - const context = useContext(DataGridContext); - if (!context) { - throw new Error('useDataGrid must be used within a DataGridProvider'); - } - return context; -}; +import { ListToolBar } from './blocks/ListToolBar'; const Kyc = () => { const [loading, setLoading] = useState(false); @@ -58,8 +40,8 @@ const Kyc = () => { limit: 10, page: 1, with_deleted: false, - order_field: 'fullname', - order_direction: 'ASC', + order_field: 'created_at', + order_direction: 'DESC', type: 'kyc' } }); @@ -72,14 +54,14 @@ const Kyc = () => { setMembers(resMembers); let getProfession: any = await axios.get(`${BASE_URL_MASTER_DATA}/profession/list`, { params: { - limit: 50, - page: 1, - with_deleted: false, - order_field: 'name', - order_direction: 'ASC', + limit: 50, + page: 1, + with_deleted: false, + order_field: 'name', + order_direction: 'ASC' } }); - setProfession(getProfession.data.data.list) + setProfession(getProfession.data.data.list); } catch (error: any) { toast.error(error.message); console.log(error); @@ -103,8 +85,12 @@ const Kyc = () => { setDialogOpen(true); } + const resetForm = () => { + setMember(initialMember); + }; + const handleYes = async () => { - setLoading(true) + setLoading(true); const userLogin: any = await getUser(); const updateData: any = member; const customerId = member.id; @@ -151,100 +137,127 @@ const Kyc = () => { if (updateData[property]) form.append(property, updateData[property]); } if (dialogType === 'reject') { - if (destinationGroup === "Premium") await axios.post(`${BASE_URL}/customer/reject`, { customerid: customerId, description: updateData.approval_description_premium }); - if (destinationGroup === "Agent") await axios.post(`${BASE_URL}/customer/reject`, { customerid: customerId, description: updateData.approval_description_agent }); + if (destinationGroup === 'Premium') + await axios.post(`${BASE_URL}/customer/reject`, { + customerid: customerId, + description: updateData.approval_description_premium + }); + if (destinationGroup === 'Agent') + await axios.post(`${BASE_URL}/customer/reject`, { + customerid: customerId, + description: updateData.approval_description_agent + }); } if (dialogType === 'update') { await axios.put(`${BASE_URL}/customer/update/${customerId}`, form); - if (updateData.isneedapproval == 1&&destinationGroup === "Premium") await axios.post(`${BASE_URL}/customer/approve`, { customerid: customerId, description: updateData.approval_description_premium}); - if (updateData.isneedapproval == 1&&destinationGroup === "Agent") await axios.post(`${BASE_URL}/customer/approve`, { customerid: customerId, description: updateData.approval_description_agent}); + if (updateData.isneedapproval == 1 && destinationGroup === 'Premium') + await axios.post(`${BASE_URL}/customer/approve`, { + customerid: customerId, + description: updateData.approval_description_premium + }); + if (updateData.isneedapproval == 1 && destinationGroup === 'Agent') + await axios.post(`${BASE_URL}/customer/approve`, { + customerid: customerId, + description: updateData.approval_description_agent + }); } setDialogOpen(false); setIsDialogOpen(false); toast.success(`Success Update & ${dialogType} Kyc Member`); } catch (error: any) { - if (error?.response?.data?.error) error.message = error?.response?.data?.error + if (error?.response?.data?.error) error.message = error?.response?.data?.error; setDialogOpen(false); setIsDialogOpen(false); toast.error(error.message); } finally { await fetchCustomers(); - setLoading(false) + setLoading(false); } }; function setShowAddDialog(el: any) { - setIsDialogOpen(el) + setIsDialogOpen(el); } if (loading) return ; + useEffect(() => { + if (!isDialogOpen) resetForm(); + }, [isDialogOpen]); + return ( <> TPAY | KYC -
-
- setDialogOpen(false)} - title="Confirm Action" - content={`Are you sure you want to ${dialogType}?`} - onYes={handleYes} - onNo={() => setDialogOpen(false)} + + setDialogOpen(false)} + title="Confirm Action" + content={`Are you sure you want to ${dialogType}?`} + onYes={handleYes} + onNo={() => setDialogOpen(false)} + /> + {member.id ? ( + // + - { member.id ? ( - // - - ): ""} -

Manage Member KYC

-
- - - Dashboard - + ) : ( + '' + )} +

+ KYC Upgrade Members +

+
+ + + Dashboard + - - Members - - - - Manage Member KYC - - -
-
-
- -
-
+ + Members + + + KYC Upgrade Members + +
-
+
+
+ } + layout={{ card: true }} + sorting={[{ id: 'created_at', desc: true }]} + serverSide={false} + onRowSelectionChange={(selected, table: any) => { + const selectedRow = table.getSelectedRowModel().rows[0]; + if (selectedRow) handleUpdate(selectedRow.original); + }} + > +
+
+ ); }; diff --git a/src/pages/members/kyc/blocks/AddDialog.tsx b/src/pages/members/kyc/blocks/AddDialog.tsx deleted file mode 100644 index 68b4d58..0000000 --- a/src/pages/members/kyc/blocks/AddDialog.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Dialog } from '@/components/ui/dialog'; -import { useRef } from 'react'; -import { useKycContext } from '../hooks'; -import { useDataGrid } from '@/components'; - -const AddDialog = () => { - const parentRef = useRef(null); - const { showAddDialog, handleAddDialog } = useKycContext(); - const { reload } = useDataGrid(); - - return ; -}; - -export default AddDialog; diff --git a/src/pages/members/kyc/blocks/ListToolBar.tsx b/src/pages/members/kyc/blocks/ListToolBar.tsx index 8d99350..180e68b 100644 --- a/src/pages/members/kyc/blocks/ListToolBar.tsx +++ b/src/pages/members/kyc/blocks/ListToolBar.tsx @@ -4,7 +4,6 @@ import { useKycContext } from '../hooks'; const ListToolBar = () => { const { table, reload } = useDataGrid(); - const { handleDetailDialog, handleAddDialog } = useKycContext(); return (
From b5b6019ce541ec36f6ace49ddff0bd69328d4a29 Mon Sep 17 00:00:00 2001 From: bagusajisaputroo Date: Tue, 15 Apr 2025 17:34:02 +0700 Subject: [PATCH 04/12] Fixed UI Managemember --- src/pages/members/manage-members/Columns.tsx | 25 ++----- .../members/manage-members/ManageMembers.tsx | 73 +++++++++++-------- .../manage-members/blocks/ListToolBar.tsx | 53 ++++++++++++++ 3 files changed, 104 insertions(+), 47 deletions(-) create mode 100644 src/pages/members/manage-members/blocks/ListToolBar.tsx diff --git a/src/pages/members/manage-members/Columns.tsx b/src/pages/members/manage-members/Columns.tsx index 983178e..6039aba 100644 --- a/src/pages/members/manage-members/Columns.tsx +++ b/src/pages/members/manage-members/Columns.tsx @@ -1,3 +1,4 @@ +import { KeenIcon } from '@/components'; import { Button } from '@/components/ui/button'; import { DropdownMenu, @@ -18,7 +19,7 @@ export type Members = { created_at: Date; }; -export const columns: ColumnDef[] = [ +export const getColumns = (handleUpdate: (data: any) => void): ColumnDef[] => [ { accessorKey: 'no', header: ({ column }) => { @@ -110,22 +111,12 @@ export const columns: ColumnDef[] = [ const dataMembers = row.original; return ( - - {/* - - */} - {/* - Actions - navigator.clipboard.writeText(dataMembers.id.toString())} - > - Copy account ID - - */} - + ); } } diff --git a/src/pages/members/manage-members/ManageMembers.tsx b/src/pages/members/manage-members/ManageMembers.tsx index 6d9cdd2..0203ab4 100644 --- a/src/pages/members/manage-members/ManageMembers.tsx +++ b/src/pages/members/manage-members/ManageMembers.tsx @@ -1,18 +1,20 @@ import { DataTable } from '@/components/ui/DataTable'; import { apiConfig } from '@/config/api.config'; -import { columns, Members, initialMember } from './Columns'; +import { getColumns, Members, initialMember } from './Columns'; import { useState, useEffect } from 'react'; import axios from 'axios'; // import CustomerDialog from './CustomerDetailModal'; import DetailMember from './blocks/DetailMember'; import ConfirmDialog from '@/components/confirm'; import { useAuthContext } from '@/auth'; -import { LoaderTransparant } from '@/components'; +import { DataGridInner, LoaderTransparant } from '@/components'; +import { DataGridProvider } from '@/components'; import { toast } from 'sonner'; import { Breadcrumbs, Link } from '@mui/material'; const BASE_URL_MASTER_DATA = apiConfig.service_master_data; const BASE_URL = apiConfig.service_customer; import { Helmet } from 'react-helmet'; +import ListToolbar from './blocks/ListToolBar'; const ManageMembers = () => { const [loading, setLoading] = useState(false); const [members, setMembers] = useState([]); @@ -23,8 +25,8 @@ const ManageMembers = () => { const [dialogOpen, setDialogOpen] = useState(false); const [dialogType, setDialogType] = useState(''); const closeDialog = () => { - setIsDialogOpen(false) - setMember(initialMember) + setIsDialogOpen(false); + setMember(initialMember); }; const { getUser } = useAuthContext(); @@ -50,7 +52,7 @@ const ManageMembers = () => { el.no = temp++; if (el.date_birth) { const d = new Date(el.date_birth); - el.date_birth = d.toLocaleString("sv-SE"); + el.date_birth = d.toLocaleString('sv-SE'); } el.name = el.fullname; return el; @@ -58,14 +60,14 @@ const ManageMembers = () => { setMembers(resMembers); let getProfession: any = await axios.get(`${BASE_URL_MASTER_DATA}/profession/list`, { params: { - limit: 50, - page: 1, - with_deleted: false, - order_field: 'name', - order_direction: 'ASC', + limit: 50, + page: 1, + with_deleted: false, + order_field: 'name', + order_direction: 'ASC' } }); - setProfession(getProfession.data.data.list) + setProfession(getProfession.data.data.list); } catch (error: any) { toast.error(error.message); console.log(error); @@ -74,14 +76,14 @@ const ManageMembers = () => { const handleUpdate = (data: any) => { setDialogType('update'); - setSelectedMember(data.id) + setSelectedMember(data.id); setMember(data); setIsDialogOpen(true); }; function createMember() { setDialogType('create'); - setSelectedMember('') + setSelectedMember(''); setMember(initialMember); setIsDialogOpen(true); } @@ -92,7 +94,7 @@ const ManageMembers = () => { } const handleYes = async () => { - setLoading(true) + setLoading(true); const userLogin: any = await getUser(); const updateData: any = member; updateData.updated_by = userLogin.data ? userLogin.data.id : ''; @@ -135,7 +137,7 @@ const ManageMembers = () => { for (const property in updateData) { if (updateData[property]) form.append(property, updateData[property]); } - + if (dialogType === 'update') { await axios.put(`${BASE_URL}/customer/update/${selectedMember}`, form, { headers: { @@ -145,8 +147,8 @@ const ManageMembers = () => { toast.success('Success Edit Member'); } if (dialogType === 'create') { - const createMember:any = member - createMember.pin = "admin" + const createMember: any = member; + createMember.pin = 'admin'; delete createMember.password; delete createMember.try_pin; delete createMember.license_number; @@ -162,7 +164,7 @@ const ManageMembers = () => { delete createMember.approval_description_premium; delete createMember.approval_description_agent; delete createMember.language; - await axios.post(`${BASE_URL}/customers/create`, member) + await axios.post(`${BASE_URL}/customers/create`, member); toast.success('Success Create Member. PIN sent to email'); } } catch (error: any) { @@ -171,12 +173,12 @@ const ManageMembers = () => { setDialogOpen(false); closeDialog(); await fetchCustomers(); - setLoading(false) + setLoading(false); } }; function setShowAddDialog(el: any) { - setIsDialogOpen(el) + setIsDialogOpen(el); } if (loading) return ; @@ -196,7 +198,7 @@ const ManageMembers = () => { onYes={handleYes} onNo={() => setDialogOpen(false)} /> - { (member.id!=='' || dialogType==='create') ? ( + {member.id !== '' || dialogType === 'create' ? ( { profession={profession} dialogType={dialogType} /> - ): ""} -

Manage Members

-
+ ) : ( + '' + )} +

+ Manage Members +

+
Dashboard @@ -225,13 +231,20 @@ const ManageMembers = () => {
- + columns={getColumns(handleUpdate)} + layout={{ card: true }} + serverSide={false} + toolbar={ + + } + onRowSelectionChange={(selected, table: any) => { + const selectedRow = table.getSelectedRowModel().rows[0]; + if (selectedRow) handleUpdate(selectedRow.original); + }} + > +
diff --git a/src/pages/members/manage-members/blocks/ListToolBar.tsx b/src/pages/members/manage-members/blocks/ListToolBar.tsx new file mode 100644 index 0000000..77742b8 --- /dev/null +++ b/src/pages/members/manage-members/blocks/ListToolBar.tsx @@ -0,0 +1,53 @@ +import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components'; +import { Button } from '@/components/ui/button'; +import { useState } from 'react'; + +const ListToolbar = ({ createMember }: { createMember: () => void }) => { + const { table, reload } = useDataGrid(); + const [ usernameFilter, setUsernameFilter] = useState(''); + const [emailFilter, setEmailFilter] = useState(''); + + const handleUsernameChange = (e: React.ChangeEvent) => { + setUsernameFilter(e.target.value); + table.getColumn('username')?.setFilterValue(e.target.value); + }; + + const handleEmailChange = (e: React.ChangeEvent) => { + setEmailFilter(e.target.value); + table.getColumn('email')?.setFilterValue(e.target.value); + }; + + return ( +
+
+
+
+ +
+
+ + + + +
+
+
+
+ ); +}; + +export default ListToolbar; From ea2bff7f9ded654ed20f6993184d472c25893e7b Mon Sep 17 00:00:00 2001 From: bagusajisaputroo Date: Tue, 15 Apr 2025 17:43:08 +0700 Subject: [PATCH 05/12] Adding 3 values on status transaction type field in transactiontype --- src/pages/transfer/transfertype/blocks/AddDialog.tsx | 4 ++++ src/pages/transfer/transfertype/blocks/EditDialog.tsx | 5 ++++- .../transfertype/hooks/ManageTransferTypeContext.tsx | 5 ++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/pages/transfer/transfertype/blocks/AddDialog.tsx b/src/pages/transfer/transfertype/blocks/AddDialog.tsx index 6e5f51f..fe6eff6 100644 --- a/src/pages/transfer/transfertype/blocks/AddDialog.tsx +++ b/src/pages/transfer/transfertype/blocks/AddDialog.tsx @@ -467,6 +467,10 @@ const AddDialog = () => { Return Agent Merchant Return Agent Emoney Reward Point + Top Up Escrow + Top Up Master Agent + Top Up Agent +
diff --git a/src/pages/transfer/transfertype/blocks/EditDialog.tsx b/src/pages/transfer/transfertype/blocks/EditDialog.tsx index 1e3ca41..1d9803b 100644 --- a/src/pages/transfer/transfertype/blocks/EditDialog.tsx +++ b/src/pages/transfer/transfertype/blocks/EditDialog.tsx @@ -589,7 +589,7 @@ const EditDialog = () => { - Disbursement + Disbursement Other Change Group Emoney Customer to Agent Change Group Emoney Agent to Customer @@ -600,6 +600,9 @@ const EditDialog = () => { Return Agent Merchant Return Agent Emoney Reward Point + Top Up Escrow + Top Up Master Agent + Top Up Agent
diff --git a/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx b/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx index 942ee8f..7e886a3 100644 --- a/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx +++ b/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx @@ -159,7 +159,10 @@ const ManageTransferTypeContextProvider = ({ children }: { children: React.React AD: 'Return Agent Deposit', AM: 'Return Agent Merchant', AE: 'Return Agent Emoney', - R: 'Reward Point' + R: 'Reward Point', + TE:'Top Up Escrow', + TM:'Top Up Master Agent', + TA:'Top Up Agent' }; return mapping[row.type] || 'Unknown'; From a247afdea31594a50e14cf5235b646c8c21a2214 Mon Sep 17 00:00:00 2001 From: Wikzyy Date: Tue, 15 Apr 2025 17:59:15 +0700 Subject: [PATCH 06/12] fix margin --- src/pages/members/kyc/Kyc.tsx | 60 ++++++++++++++++------------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/src/pages/members/kyc/Kyc.tsx b/src/pages/members/kyc/Kyc.tsx index b27ce0f..969db5e 100644 --- a/src/pages/members/kyc/Kyc.tsx +++ b/src/pages/members/kyc/Kyc.tsx @@ -222,41 +222,37 @@ const Kyc = () => { ) : ( '' )} -

- KYC Upgrade Members -

-
- - - Dashboard - +

KYC Upgrade Members

+ + + Dashboard + - - Members - + + Members + - - KYC Upgrade Members - - -
-
-
- } - layout={{ card: true }} - sorting={[{ id: 'created_at', desc: true }]} - serverSide={false} - onRowSelectionChange={(selected, table: any) => { - const selectedRow = table.getSelectedRowModel().rows[0]; - if (selectedRow) handleUpdate(selectedRow.original); - }} - > -
+ + KYC Upgrade Members + + + {/*
*/} +
+ } + layout={{ card: true }} + sorting={[{ id: 'created_at', desc: true }]} + serverSide={false} + onRowSelectionChange={(selected, table: any) => { + const selectedRow = table.getSelectedRowModel().rows[0]; + if (selectedRow) handleUpdate(selectedRow.original); + }} + >
+ {/*
*/} ); From f71b203eb7552f3e2c75178a0b28a96e4a9d4da5 Mon Sep 17 00:00:00 2001 From: Wikzyy Date: Tue, 15 Apr 2025 19:36:35 +0700 Subject: [PATCH 07/12] update pading and pagination on Manage Members --- .../members/manage-members/ManageMembers.tsx | 110 ++++++++---------- 1 file changed, 51 insertions(+), 59 deletions(-) diff --git a/src/pages/members/manage-members/ManageMembers.tsx b/src/pages/members/manage-members/ManageMembers.tsx index 0203ab4..8d27979 100644 --- a/src/pages/members/manage-members/ManageMembers.tsx +++ b/src/pages/members/manage-members/ManageMembers.tsx @@ -7,7 +7,7 @@ import axios from 'axios'; import DetailMember from './blocks/DetailMember'; import ConfirmDialog from '@/components/confirm'; import { useAuthContext } from '@/auth'; -import { DataGridInner, LoaderTransparant } from '@/components'; +import { Container, DataGridInner, LoaderTransparant } from '@/components'; import { DataGridProvider } from '@/components'; import { toast } from 'sonner'; import { Breadcrumbs, Link } from '@mui/material'; @@ -188,67 +188,59 @@ const ManageMembers = () => { TPAY | Manage Members -
-
- setDialogOpen(false)} - title="Confirm Action" - content={`Are you sure you want to ${dialogType}?`} - onYes={handleYes} - onNo={() => setDialogOpen(false)} + + setDialogOpen(false)} + title="Confirm Action" + content={`Are you sure you want to ${dialogType}?`} + onYes={handleYes} + onNo={() => setDialogOpen(false)} + /> + {member.id !== '' || dialogType === 'create' ? ( + - {member.id !== '' || dialogType === 'create' ? ( - - ) : ( - '' - )} -

- Manage Members -

-
- - - Dashboard - - - Members - + ) : ( + '' + )} +

Manage Members

+ + + Dashboard + + + Members + - - Manage Members - - -
-
-
- - } - onRowSelectionChange={(selected, table: any) => { - const selectedRow = table.getSelectedRowModel().rows[0]; - if (selectedRow) handleUpdate(selectedRow.original); - }} - > - -
-
+ + Manage Members + + + {/*
*/} +
+ } + onRowSelectionChange={(selected, table: any) => { + const selectedRow = table.getSelectedRowModel().rows[0]; + if (selectedRow) handleUpdate(selectedRow.original); + }} + >
-
+ {/*
*/} + ); }; From c51889d4401623edb86b9aa05877eb18b1a0ea29 Mon Sep 17 00:00:00 2001 From: Wikzyy Date: Tue, 15 Apr 2025 21:11:09 +0700 Subject: [PATCH 08/12] update table on manage group --- src/pages/groups/Column.tsx | 22 +++- src/pages/groups/ListToolbar.tsx | 49 +++++++ src/pages/groups/ManageGroups.tsx | 205 ++++++++++++++++-------------- 3 files changed, 178 insertions(+), 98 deletions(-) create mode 100644 src/pages/groups/ListToolbar.tsx diff --git a/src/pages/groups/Column.tsx b/src/pages/groups/Column.tsx index d796078..2f6fe7f 100644 --- a/src/pages/groups/Column.tsx +++ b/src/pages/groups/Column.tsx @@ -1,3 +1,4 @@ +import { KeenIcon } from '@/components'; import { ColumnDef } from '@tanstack/react-table'; export type Group = { @@ -8,7 +9,7 @@ export type Group = { description: string; }; -export const columns: ColumnDef[] = [ +export const getColumns = (handleUpdate: (data: any) => void): ColumnDef[] => [ { accessorKey: 'no', header: 'ID' @@ -30,8 +31,19 @@ export const columns: ColumnDef[] = [ accessorKey: 'description', header: 'Description' }, - // { - // id: 'actions', - // header: 'Actions' - // } + { + id: 'actions', + cell: ({ row }) => { + const dataMembers = row.original; + + return ( + + ); + } + } ]; diff --git a/src/pages/groups/ListToolbar.tsx b/src/pages/groups/ListToolbar.tsx new file mode 100644 index 0000000..7ab5fa4 --- /dev/null +++ b/src/pages/groups/ListToolbar.tsx @@ -0,0 +1,49 @@ +import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components'; +import { Button } from '@/components/ui/button'; + +const ListToolBar = ({ createGroup }: { createGroup: () => void }) => { + const { table, reload } = useDataGrid(); + + return ( +
+
+
+
+ + + + +
+
+ + + + +
+
+
+
+ ); +}; + +export { ListToolBar }; diff --git a/src/pages/groups/ManageGroups.tsx b/src/pages/groups/ManageGroups.tsx index 55ae1eb..3ba347d 100644 --- a/src/pages/groups/ManageGroups.tsx +++ b/src/pages/groups/ManageGroups.tsx @@ -1,5 +1,5 @@ import { DataTable } from '@/components/ui/DataTable'; -import { columns, Group } from './Column'; +import { getColumns, Group } from './Column'; import { apiConfig } from '@/config/api.config'; import axios, { AxiosResponse } from 'axios'; import { Helmet } from 'react-helmet'; @@ -24,6 +24,8 @@ import CloseIcon from '@mui/icons-material/Close'; import Divider from '@mui/material/Divider'; import ConfirmDialog from '@/components/confirm'; import { toast } from 'sonner'; +import { Container, DataGridProvider } from '@/components'; +import { ListToolBar } from './ListToolbar'; // import { DialogHeader } from '@/components/ui/dialog'; // import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; const BASE_URL = apiConfig.service_customer; @@ -89,9 +91,9 @@ const ManageGroups = () => { const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); - if (!formData.groupName) return toast.warning(`Group name can not be empty!`) - if (!formData.status) return toast.warning(`Status can not be empty!`) - if (!formData.description) return toast.warning(`Description can not be empty!`) + if (!formData.groupName) return toast.warning(`Group name can not be empty!`); + if (!formData.status) return toast.warning(`Status can not be empty!`); + if (!formData.description) return toast.warning(`Description can not be empty!`); setIsDialogOpen(false); setDialogOpen(true); }; @@ -134,7 +136,7 @@ const ManageGroups = () => { description: formData.description, created_at: new Date() }); - toast.success(`Success create group`) + toast.success(`Success create group`); } else if (dialogType === 'update') { await axios.put(`${BASE_URL}/groups/update/${formData.id}`, { name: formData.groupName, @@ -142,14 +144,14 @@ const ManageGroups = () => { description: formData.description, updated_at: new Date() }); - toast.success(`Success update group`) + toast.success(`Success update group`); } else if (dialogType === 'delete') { await axios.delete(`${BASE_URL}/groups/delete/${formData.id}/true`); - toast.success(`Success delete group`) + toast.success(`Success delete group`); } } catch (error: any) { console.log(error); - toast.error(error.message) + toast.error(error.message); } finally { await fetchGroups(); setDialogOpen(false); @@ -162,19 +164,19 @@ const ManageGroups = () => { TPAY | Manage Group - setDialogOpen(false)} - title="Confirm Action" - content={ - `Are you sure you want to ` + - (dialogType === 'create' ? 'create?' : dialogType === 'update' ? 'update?' : 'delete?') - } - onYes={handleYes} - onNo={() => setDialogOpen(false)} - /> -

Groups

-
+ + setDialogOpen(false)} + title="Confirm Action" + content={ + `Are you sure you want to ` + + (dialogType === 'create' ? 'create?' : dialogType === 'update' ? 'update?' : 'delete?') + } + onYes={handleYes} + onNo={() => setDialogOpen(false)} + /> +

Groups

Dashboard @@ -188,84 +190,101 @@ const ManageGroups = () => { Manage Groups -
-
- */} +
+ {/* -
+ /> */} + } + layout={{ card: true }} + sorting={[{ id: 'created_at', desc: true }]} + serverSide={false} + onRowSelectionChange={(selected, table: any) => { + const selectedRow = table.getSelectedRowModel().rows[0]; + if (selectedRow) handleUpdate(selectedRow.original); + }} + /> +
+ {/*
*/} - - -
- {dialogType==='create'?"Create New Group":"Update Group"} - - - -
- -
-
-
- - -
-
- - - - } - label="Yes" - /> - } - label="No" - /> - - -
-
- - -
- -
-
-
-
+ + +
+ + {dialogType === 'create' ? 'Create New Group' : 'Update Group'} + + + + +
+ +
+
+
+ + +
+
+ + + + } + label="Yes" + /> + } + label="No" + /> + + +
+
+ + +
+ +
+
+
+
+ ); }; From de9702b1b4f2ba21a1a909143de4ffab7c7ba869 Mon Sep 17 00:00:00 2001 From: Wikzyy Date: Tue, 15 Apr 2025 21:13:38 +0700 Subject: [PATCH 09/12] update table on manage groups - remove button filter --- src/pages/groups/ListToolbar.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/groups/ListToolbar.tsx b/src/pages/groups/ListToolbar.tsx index 7ab5fa4..793f4c9 100644 --- a/src/pages/groups/ListToolbar.tsx +++ b/src/pages/groups/ListToolbar.tsx @@ -18,17 +18,17 @@ const ListToolBar = ({ createGroup }: { createGroup: () => void }) => { onChange={(event) => table.getColumn('name')?.setFilterValue(event.target.value)} /> - + {/* - + */}
- ); - - // return ( - // - // - // - // Resend Transaction - // - // - //

tes dialog

- // {/*
- //
- //
- //
- // - - //
- // - //
- //
- //
- - - //
- //
- // - //
- //
- //
*/} - //
- //
- //
- // ); }; export default ResendTransaction; diff --git a/src/pages/transaction/history-transaction/hooks/TransactionContext.tsx b/src/pages/transaction/history-transaction/hooks/TransactionContext.tsx index 42bcd1b..00bbdf0 100644 --- a/src/pages/transaction/history-transaction/hooks/TransactionContext.tsx +++ b/src/pages/transaction/history-transaction/hooks/TransactionContext.tsx @@ -11,6 +11,7 @@ import { useNavigate } from 'react-router'; import DetailTransaction from '../blocks/DetailTransaction'; import { log } from 'console'; import ResendTransaction from '../blocks/ResendTransaction'; +import { comment } from 'stylis'; interface TransactionProps { id: number; @@ -31,9 +32,8 @@ interface ContextProps { selectedTransactionId: number | null; setSelectedTransactionId: React.Dispatch>; showResendDialog: boolean; - setShowResendDialog: React.Dispatch>; - selectedTransactionRowForResend: any | null; - setTransactionRowForResend: React.Dispatch>; + handleResendDialog: (show: boolean, selected_transaction: string | null) => void; + selectedTransactionForResend: string | null; } const initialProps: ContextProps = { @@ -43,9 +43,8 @@ const initialProps: ContextProps = { selectedTransactionId: null, setSelectedTransactionId: () => { }, showResendDialog: false, - setShowResendDialog: () => { }, - selectedTransactionRowForResend: null, - setTransactionRowForResend: () => { } + handleResendDialog: (show: boolean, selected_transaction: string | null) => { }, + selectedTransactionForResend: null }; const ManageTransactionContext = createContext(initialProps); @@ -61,7 +60,13 @@ const TransactionProvider = ({ children }: { children: React.ReactNode }) => { const url = navigate(`${API_URL}/transaction/history/${path}`); }; const [showResendDialog, setShowResendDialog] = useState(false); - const [selectedTransactionRowForResend, setTransactionRowForResend] = useState(null); + const [selectedTransactionForResend, setSelectedTransactionForResend] = useState(null); + + const handleResendDialog = useCallback((show: boolean, selected_transaction: string | null) => { + setSelectedTransactionForResend(show ? selected_transaction : null); + setShowResendDialog(show); + }, []); + const columns = useMemo[]>( () => [ @@ -174,7 +179,7 @@ const TransactionProvider = ({ children }: { children: React.ReactNode }) => { ); }, - }, + }, { accessorKey: 'description', header: ({ column }) => , @@ -216,10 +221,9 @@ const TransactionProvider = ({ children }: { children: React.ReactNode }) => { {isVisible && + {/*