From dfdac75b8ef53a3472d7e900d525a7aae0456291 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 17 Apr 2025 09:58:45 +0700 Subject: [PATCH 1/7] fix member --- src/pages/members/kyc/Kyc.tsx | 32 ++++++--------- .../members/manage-members/ManageMembers.tsx | 1 + .../manage-members/blocks/AdmAccess.tsx | 19 --------- .../manage-members/blocks/DetailMember.tsx | 39 +++++++++++-------- 4 files changed, 35 insertions(+), 56 deletions(-) diff --git a/src/pages/members/kyc/Kyc.tsx b/src/pages/members/kyc/Kyc.tsx index b27ce0f..6bae188 100644 --- a/src/pages/members/kyc/Kyc.tsx +++ b/src/pages/members/kyc/Kyc.tsx @@ -85,16 +85,11 @@ const Kyc = () => { setDialogOpen(true); } - const resetForm = () => { - setMember(initialMember); - }; - const handleYes = async () => { setLoading(true); const userLogin: any = await getUser(); const updateData: any = member; const customerId = member.id; - const description = member.description; const destinationGroup = updateData.destinationGroup; updateData.updated_by = userLogin.data ? userLogin.data.id : ''; let today = new Date(); @@ -161,15 +156,13 @@ const Kyc = () => { 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; - setDialogOpen(false); - setIsDialogOpen(false); toast.error(error.message); } finally { + setDialogOpen(false); + setIsDialogOpen(false); await fetchCustomers(); setLoading(false); } @@ -179,11 +172,15 @@ const Kyc = () => { setIsDialogOpen(el); } - if (loading) return ; + // const resetForm = () => { + // setMember(initialMember); + // }; - useEffect(() => { - if (!isDialogOpen) resetForm(); - }, [isDialogOpen]); + // useEffect(() => { + // if (!isDialogOpen) resetForm(); + // }, [isDialogOpen]); + + if (loading) return ; return ( <> @@ -200,14 +197,6 @@ const Kyc = () => { onNo={() => setDialogOpen(false)} /> {member.id ? ( - // { initialData={member} fetchCustomers={fetchCustomers} profession={profession} + dialogType={dialogType} page={'kyc'} /> ) : ( diff --git a/src/pages/members/manage-members/ManageMembers.tsx b/src/pages/members/manage-members/ManageMembers.tsx index 0203ab4..a6c05e1 100644 --- a/src/pages/members/manage-members/ManageMembers.tsx +++ b/src/pages/members/manage-members/ManageMembers.tsx @@ -15,6 +15,7 @@ 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([]); diff --git a/src/pages/members/manage-members/blocks/AdmAccess.tsx b/src/pages/members/manage-members/blocks/AdmAccess.tsx index bf735c3..3ebe437 100644 --- a/src/pages/members/manage-members/blocks/AdmAccess.tsx +++ b/src/pages/members/manage-members/blocks/AdmAccess.tsx @@ -26,29 +26,10 @@ export default function AdmAccess({page,groups,formData,handleClose,fetchCustome const [dialogType, setDialogType] = useState(''); const [changeGroup, setChangeGroup] = useState(''); const [changeGroupD, setChangeGroupD] = useState(false); - // const [groups, setGroups] = useState([]); useEffect(() => { - // fetchGroups(); }, []); - // const fetchGroups = async () => { - // try { - // let getGroups = await axios.get(`${BASE_URL_CUSTOMER}/groups/list`, { - // params: { - // limit: 50, - // page: 1, - // with_deleted: false, - // order_field: 'name', - // order_direction: 'ASC' - // } - // }); - // setGroups(getGroups.data.data.list); - // } catch (error: any) { - // toast.error(error.message); - // } - // }; - const handleYes = async () => { try { if (dialogType === 'update status') { diff --git a/src/pages/members/manage-members/blocks/DetailMember.tsx b/src/pages/members/manage-members/blocks/DetailMember.tsx index 9852562..2ce6b25 100644 --- a/src/pages/members/manage-members/blocks/DetailMember.tsx +++ b/src/pages/members/manage-members/blocks/DetailMember.tsx @@ -183,7 +183,7 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa return ( handleAddDialog(open)}> - + Member - {dialogType ==='create' ? "Create" : "View/Edit"} @@ -196,7 +196,8 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa )} -
+ {/*
*/} +
{(formData.id || dialogType === "create") ? generateList(formData, handleChange, groups, 'group_id', 'Group', true, dialogType === "update"||false): ''} {/* {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Group', 'group_name', 'text', true, true): ''} */} @@ -233,19 +234,25 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Mother Fullname', 'mother_fullname', 'text', true, viewOnly): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Identity Number', 'identity_number', 'text', false, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'License Number', 'license_number', 'text', false, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Merchant Name', 'agent_name', 'text', false, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Merchant Address', 'merchantaddress', 'text', false, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Longitude Merchant', 'longitudemerchant', 'text', false, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Latitude Merchant', 'latitudemerchant', 'text', false, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Selfie', 'file_selfie'): ''} - {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Document', 'file_document_id'): ''} - {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Document & Selfie', 'file_document_id_selfie'): ''} - {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Commercial License', 'file_commercial_license'): ''} - - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, banks, 'bank_name', 'Bank Name', false, false): ''} - {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Bank Account', 'bank_account', 'text', false, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'iBank Number', 'ibank_number', 'text', false, viewOnly): ''} +
+

Agent Information

+ {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'License Number', 'license_number', 'text', false, viewOnly): ''} + {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Merchant Name', 'agent_name', 'text', false, viewOnly): ''} + {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Merchant Address', 'merchantaddress', 'text', false, viewOnly): ''} + {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Longitude Merchant', 'longitudemerchant', 'text', false, viewOnly): ''} + {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Latitude Merchant', 'latitudemerchant', 'text', false, viewOnly): ''} + {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Selfie', 'file_selfie'): ''} + {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Document', 'file_document_id'): ''} + {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Document & Selfie', 'file_document_id_selfie'): ''} + {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Commercial License', 'file_commercial_license'): ''} +
+ +
+

Bank Information

+ {(formData.id || dialogType === "create") ? generateList(formData, handleChange, banks, 'bank_name', 'Bank Name', false, false): ''} + {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Bank Account', 'bank_account', 'text', false, viewOnly): ''} + {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'iBank Number', 'ibank_number', 'text', false, viewOnly): ''} +
{(formData.id&&(!page||formData.destinationGroup === "Premium")) ? generateInput(formData, handleChange, 'Approval Premium Description', 'approval_description_premium', 'text', false, viewOnly): ''} {(formData.id&&(!page||formData.destinationGroup === "Agent")) ? generateInput(formData, handleChange, 'Approval Agent Description', 'approval_description_agent', 'text', false, viewOnly): ''} @@ -257,7 +264,7 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa ) : ""} -
+
{/* */} From 7644112bfa9f5d512a1929b7055780e6d65216fa Mon Sep 17 00:00:00 2001 From: bagusajisaputroo Date: Thu, 17 Apr 2025 16:28:59 +0700 Subject: [PATCH 2/7] fixing managemember --- .../members/manage-members/ManageMembers.tsx | 53 ++++++++++++------- .../manage-members/blocks/ListToolBar.tsx | 37 +++++++++---- .../transfertype/blocks/ListToolBar.tsx | 1 + 3 files changed, 64 insertions(+), 27 deletions(-) diff --git a/src/pages/members/manage-members/ManageMembers.tsx b/src/pages/members/manage-members/ManageMembers.tsx index 8d27979..7ac36d2 100644 --- a/src/pages/members/manage-members/ManageMembers.tsx +++ b/src/pages/members/manage-members/ManageMembers.tsx @@ -3,7 +3,6 @@ import { apiConfig } from '@/config/api.config'; 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'; @@ -15,6 +14,7 @@ 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'; +import { RefreshCw } from 'lucide-react'; const ManageMembers = () => { const [loading, setLoading] = useState(false); const [members, setMembers] = useState([]); @@ -24,6 +24,7 @@ const ManageMembers = () => { const [isDialogOpen, setIsDialogOpen] = useState(false); const [dialogOpen, setDialogOpen] = useState(false); const [dialogType, setDialogType] = useState(''); + const [isReloading, setIsReloading] = useState(false); const closeDialog = () => { setIsDialogOpen(false); setMember(initialMember); @@ -36,7 +37,7 @@ const ManageMembers = () => { setLoading(false); }, []); - async function fetchCustomers() { + async function fetchCustomers(): Promise { try { let customers = await axios.get(`${BASE_URL}/customer/list`, { params: { @@ -46,7 +47,7 @@ const ManageMembers = () => { order_field: 'created_at', order_direction: 'DESC' } - }); + }); let temp = 1; let resMembers = customers.data.data.list.map((el: any) => { el.no = temp++; @@ -71,8 +72,12 @@ const ManageMembers = () => { } catch (error: any) { toast.error(error.message); console.log(error); + } finally { + setLoading(false) + setIsReloading(false); } } + const handleUpdate = (data: any) => { setDialogType('update'); @@ -92,7 +97,10 @@ const ManageMembers = () => { setMember(data); setDialogOpen(true); } - + const handleReload = () => { + setIsReloading(true); + fetchCustomers(); + }; const handleYes = async () => { setLoading(true); const userLogin: any = await getUser(); @@ -225,20 +233,29 @@ const ManageMembers = () => { {/*
*/} -
- } - onRowSelectionChange={(selected, table: any) => { - const selectedRow = table.getSelectedRowModel().rows[0]; - if (selectedRow) handleUpdate(selectedRow.original); - }} - > -
+ +
+ {isReloading && ( +
+
+ + Refreshing data... +
+
+ )} + } + 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 index 3e77aca..dbf32bb 100644 --- a/src/pages/members/manage-members/blocks/ListToolBar.tsx +++ b/src/pages/members/manage-members/blocks/ListToolBar.tsx @@ -1,12 +1,20 @@ -import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components'; import { Button } from '@/components/ui/button'; +import { UserPlus } from 'lucide-react'; +import { KeenIcon, useDataGrid } from '@/components'; +import { DefaultTooltip } from '@/components'; import { useState } from 'react'; -const ListToolbar = ({ createMember }: { createMember: () => void }) => { - const { table, reload } = useDataGrid(); - const [usernameFilter, setUsernameFilter] = useState(''); - const [emailFilter, setEmailFilter] = useState(''); +interface ListToolbarProps { + createMember: () => void; + onReload: () => void; + isReloading: boolean; +} +const ListToolbar = ({ createMember, onReload, isReloading }: ListToolbarProps) => { + + const [emailFilter, setEmailFilter] = useState(''); + const [usernameFilter, setUsernameFilter] = useState(''); + const {table}=useDataGrid(); const handleUsernameChange = (e: React.ChangeEvent) => { setUsernameFilter(e.target.value); table.getColumn('username')?.setFilterValue(e.target.value); @@ -34,9 +42,20 @@ const ListToolbar = ({ createMember }: { createMember: () => void }) => { - -
@@ -46,4 +65,4 @@ const ListToolbar = ({ createMember }: { createMember: () => void }) => { ); }; -export default ListToolbar; +export default ListToolbar; \ No newline at end of file diff --git a/src/pages/transfer/transfertype/blocks/ListToolBar.tsx b/src/pages/transfer/transfertype/blocks/ListToolBar.tsx index 7d9e413..47833ba 100644 --- a/src/pages/transfer/transfertype/blocks/ListToolBar.tsx +++ b/src/pages/transfer/transfertype/blocks/ListToolBar.tsx @@ -12,6 +12,7 @@ const ListToolbar = () => { useEffect(() => { const timer = setTimeout(() => { table.getColumn('name')?.setFilterValue(searchValue); + table.setPageIndex(0); }, 200); return () => clearTimeout(timer); From 45b2bccbde0c07c72ccfdc1b60f7a7d0ffe04917 Mon Sep 17 00:00:00 2001 From: bagusajisaputroo Date: Thu, 17 Apr 2025 16:44:17 +0700 Subject: [PATCH 3/7] adding purchase loja on status transaction type field in transaction type module --- src/pages/transfer/transfertype/blocks/AddDialog.tsx | 3 ++- src/pages/transfer/transfertype/blocks/EditDialog.tsx | 5 +++-- .../transfertype/hooks/ManageTransferTypeContext.tsx | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/pages/transfer/transfertype/blocks/AddDialog.tsx b/src/pages/transfer/transfertype/blocks/AddDialog.tsx index fe6eff6..581ba03 100644 --- a/src/pages/transfer/transfertype/blocks/AddDialog.tsx +++ b/src/pages/transfer/transfertype/blocks/AddDialog.tsx @@ -470,7 +470,8 @@ const AddDialog = () => { Top Up Escrow Top Up Master Agent Top Up Agent - + Purchase Loja +
diff --git a/src/pages/transfer/transfertype/blocks/EditDialog.tsx b/src/pages/transfer/transfertype/blocks/EditDialog.tsx index edd00ed..28e2296 100644 --- a/src/pages/transfer/transfertype/blocks/EditDialog.tsx +++ b/src/pages/transfer/transfertype/blocks/EditDialog.tsx @@ -365,7 +365,7 @@ const EditDialog = () => { return () => clearTimeout(timer); }, [showEditDialog, selectedTransferType, GetData]); - + useEffect(() => { if (showEditDialog === false) { resetForm(); @@ -590,7 +590,7 @@ const EditDialog = () => { - Disbursement + Disbursement Other Change Group Emoney Customer to Agent Change Group Emoney Agent to Customer @@ -604,6 +604,7 @@ const EditDialog = () => { Top Up Escrow Top Up Master Agent Top Up Agent + Purchase Loja
diff --git a/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx b/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx index dfdd72d..a21febf 100644 --- a/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx +++ b/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx @@ -185,7 +185,8 @@ const ManageTransferTypeContextProvider = ({ children }: { children: React.React R: 'Reward Point', TE:'Top Up Escrow', TM:'Top Up Master Agent', - TA:'Top Up Agent' + TA:'Top Up Agent', + PL:'Purchase Loja' }; return mapping[row.type] || 'Unknown'; From d4239820f4e48965024254799eef24ae15d953e2 Mon Sep 17 00:00:00 2001 From: Wikzyy Date: Thu, 17 Apr 2025 16:54:03 +0700 Subject: [PATCH 4/7] fix refresh on kyc --- src/pages/members/kyc/Kyc.tsx | 31 ++++++++++- src/pages/members/kyc/blocks/ListToolBar.tsx | 55 ++++++++++--------- .../members/manage-members/ManageMembers.tsx | 55 ++++++++++--------- 3 files changed, 88 insertions(+), 53 deletions(-) diff --git a/src/pages/members/kyc/Kyc.tsx b/src/pages/members/kyc/Kyc.tsx index 969db5e..6e3fcbf 100644 --- a/src/pages/members/kyc/Kyc.tsx +++ b/src/pages/members/kyc/Kyc.tsx @@ -1,4 +1,10 @@ -import { Container, DataGridInner, DataGridProvider, TDataGridProps } from '@/components'; +import { + Container, + DataGridInner, + DataGridProvider, + TDataGridProps, + useDataGrid +} from '@/components'; import { DataTable } from '@/components/ui/DataTable'; import { Table } from '@tanstack/react-table'; import React, { createContext, useContext, useState, useEffect } from 'react'; @@ -17,6 +23,7 @@ import DetailMember from '../manage-members/blocks/DetailMember'; import { Breadcrumbs, Link } from '@mui/material'; import { Helmet } from 'react-helmet'; import { ListToolBar } from './blocks/ListToolBar'; +import { RefreshCw } from 'lucide-react'; const Kyc = () => { const [loading, setLoading] = useState(false); @@ -26,6 +33,7 @@ const Kyc = () => { const [isDialogOpen, setIsDialogOpen] = useState(false); const [dialogOpen, setDialogOpen] = useState(false); const [dialogType, setDialogType] = useState(''); + const [isReloading, setIsReloading] = useState(false); const closeDialog = () => setIsDialogOpen(false); const { getUser } = useAuthContext(); @@ -65,6 +73,9 @@ const Kyc = () => { } catch (error: any) { toast.error(error.message); console.log(error); + } finally { + setLoading(false); + setIsReloading(false); } } @@ -89,6 +100,11 @@ const Kyc = () => { setMember(initialMember); }; + const handleReload = () => { + setIsReloading(true); + fetchCustomers(); + }; + const handleYes = async () => { setLoading(true); const userLogin: any = await getUser(); @@ -172,6 +188,7 @@ const Kyc = () => { } finally { await fetchCustomers(); setLoading(false); + setIsReloading(false); } }; @@ -237,12 +254,20 @@ const Kyc = () => { {/*
*/} -
+
+ {isReloading && ( +
+
+ + Refreshing data... +
+
+ )} } + toolbar={} layout={{ card: true }} sorting={[{ id: 'created_at', desc: true }]} serverSide={false} diff --git a/src/pages/members/kyc/blocks/ListToolBar.tsx b/src/pages/members/kyc/blocks/ListToolBar.tsx index 180e68b..54ffca7 100644 --- a/src/pages/members/kyc/blocks/ListToolBar.tsx +++ b/src/pages/members/kyc/blocks/ListToolBar.tsx @@ -1,40 +1,45 @@ import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components'; import { Button } from '@/components/ui/button'; import { useKycContext } from '../hooks'; +import { useState } from 'react'; -const ListToolBar = () => { +interface ListToolbarProps { + onReload: () => void; + isReloading: boolean; +} + +const ListToolBar = ({ onReload, isReloading }: ListToolbarProps) => { const { table, reload } = useDataGrid(); + const [usernameFilter, setUsernameFilter] = useState(''); + + const handleUsernameChange = (e: React.ChangeEvent) => { + setUsernameFilter(e.target.value); + table.getColumn('username')?.setFilterValue(e.target.value); + }; return (
-
- - - - +
+
- -
diff --git a/src/pages/members/manage-members/ManageMembers.tsx b/src/pages/members/manage-members/ManageMembers.tsx index 7ac36d2..3dedff3 100644 --- a/src/pages/members/manage-members/ManageMembers.tsx +++ b/src/pages/members/manage-members/ManageMembers.tsx @@ -47,7 +47,7 @@ const ManageMembers = () => { order_field: 'created_at', order_direction: 'DESC' } - }); + }); let temp = 1; let resMembers = customers.data.data.list.map((el: any) => { el.no = temp++; @@ -73,11 +73,10 @@ const ManageMembers = () => { toast.error(error.message); console.log(error); } finally { - setLoading(false) + setLoading(false); setIsReloading(false); } } - const handleUpdate = (data: any) => { setDialogType('update'); @@ -233,29 +232,35 @@ const ManageMembers = () => { {/*
*/} - +
- {isReloading && ( -
-
- - Refreshing data... -
-
- )} - } - onRowSelectionChange={(selected, table: any) => { - const selectedRow = table.getSelectedRowModel().rows[0]; - if (selectedRow) handleUpdate(selectedRow.original); - }} - > -
+ {isReloading && ( +
+
+ + Refreshing data... +
+
+ )} + + } + onRowSelectionChange={(selected, table: any) => { + const selectedRow = table.getSelectedRowModel().rows[0]; + if (selectedRow) handleUpdate(selectedRow.original); + }} + > +
{/*
*/} From d550a9c5f1abf5ee6fcd3fb068981efdb2929b87 Mon Sep 17 00:00:00 2001 From: Wikzyy Date: Thu, 17 Apr 2025 16:56:05 +0700 Subject: [PATCH 5/7] fix bug on kyc table --- src/pages/members/kyc/Kyc.tsx | 1 - src/pages/members/kyc/blocks/ListToolBar.tsx | 1 - .../members/kyc/hooks/ManageKycContext.tsx | 145 ------------------ src/pages/members/kyc/hooks/index.ts | 2 - src/pages/members/kyc/hooks/useKycContext.tsx | 12 -- 5 files changed, 161 deletions(-) delete mode 100644 src/pages/members/kyc/hooks/ManageKycContext.tsx delete mode 100644 src/pages/members/kyc/hooks/index.ts delete mode 100644 src/pages/members/kyc/hooks/useKycContext.tsx diff --git a/src/pages/members/kyc/Kyc.tsx b/src/pages/members/kyc/Kyc.tsx index 6e3fcbf..bd62625 100644 --- a/src/pages/members/kyc/Kyc.tsx +++ b/src/pages/members/kyc/Kyc.tsx @@ -8,7 +8,6 @@ import { 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 { getColumns, initialMember } from './Columns'; import { useAuthContext } from '@/auth'; import { LoaderTransparant } from '@/components'; diff --git a/src/pages/members/kyc/blocks/ListToolBar.tsx b/src/pages/members/kyc/blocks/ListToolBar.tsx index 54ffca7..804c008 100644 --- a/src/pages/members/kyc/blocks/ListToolBar.tsx +++ b/src/pages/members/kyc/blocks/ListToolBar.tsx @@ -1,6 +1,5 @@ import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components'; import { Button } from '@/components/ui/button'; -import { useKycContext } from '../hooks'; import { useState } from 'react'; interface ListToolbarProps { diff --git a/src/pages/members/kyc/hooks/ManageKycContext.tsx b/src/pages/members/kyc/hooks/ManageKycContext.tsx deleted file mode 100644 index 2a63fe1..0000000 --- a/src/pages/members/kyc/hooks/ManageKycContext.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import { DataGridColumnHeader, DataGridProvider, KeenIcon } from '@/components'; -import { Toaster } from '@/components/ui/sonner'; -import { apiConfig } from '@/config/api.config'; -import { ColumnDef } from '@tanstack/react-table'; -import { createContext, useCallback, useMemo, useState } from 'react'; -import { ListToolBar } from '../blocks/ListToolBar'; - -interface SelectedUser { - id: string; - name: string; - email: string; - role: string; - description: string; - created_date: Date; -} - -interface ContextProps { - showDetailDialog: boolean; - handleDetailDialog: (show: boolean, selected_user: SelectedUser | null) => void; - showAddDialog: boolean; - handleAddDialog: (show: boolean) => void; - selectedUser: SelectedUser | null; -} - -const initialProps: ContextProps = { - showDetailDialog: false, - handleDetailDialog: () => {}, - showAddDialog: false, - handleAddDialog: () => {}, - selectedUser: null -}; - -const ManageKycContext = createContext(initialProps); -const API_URL = apiConfig.service_dashboard; - -const ManageKycContextProvider = ({ children }: { children: React.ReactNode }) => { - const [showDetailDialog, setShowDetailDialog] = useState(false); - const [showAddDialog, setShowAddDialog] = useState(false); - const [selectedUser, setSelectedUser] = useState(null); - - const handleDetailDialog = useCallback((show: boolean, selected_user: SelectedUser | null) => { - setSelectedUser(show ? selected_user : null); - setShowDetailDialog(show); - }, []); - - const handleAddDialog = useCallback((show: boolean) => { - setShowAddDialog(show); - }, []); - - const columns = useMemo[]>( - () => [ - { - accessorFn: (row) => row.id, - id: 'id', - header: ({ column }) => , - enableSorting: true, - enableHiding: false, - meta: { - headerClassName: 'w-[100px]' - } - }, - { - accessorFn: (row) => row.created_date, - id: 'created_date', - header: ({ column }) => , - enableSorting: true, - enableHiding: false, - meta: { - headerClassName: 'w-[250px]' - } - }, - { - accessorFn: (row) => row.name, - id: 'name', - header: ({ column }) => , - enableSorting: true, - enableHiding: false, - meta: { - headerClassName: 'w-[350px]' - } - }, - { - accessorFn: (row) => row.description, - id: 'description', - header: ({ column }) => , - enableSorting: true, - meta: { - headerClassName: 'w-[350px]' - } - }, - { - id: 'actions', - enableSorting: false, - header: ({ column }) => , - cell: (data: any) => { - const row = data.row.original; - - return ( - <> - - - ); - }, - meta: { - headerClassName: 'w-[100px]', - cellClassName: 'text-center' - } - } - ], - [handleDetailDialog] - ); - - return ( - - - - } - layout={{ card: true }} - sorting={[{ id: 'name', desc: false }]} - serverSide={true} - > - {children} - - - ); -}; - -export { ManageKycContextProvider, ManageKycContext }; -export type { SelectedUser }; diff --git a/src/pages/members/kyc/hooks/index.ts b/src/pages/members/kyc/hooks/index.ts deleted file mode 100644 index 246dfa8..0000000 --- a/src/pages/members/kyc/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './ManageKycContext'; -export * from './useKycContext'; diff --git a/src/pages/members/kyc/hooks/useKycContext.tsx b/src/pages/members/kyc/hooks/useKycContext.tsx deleted file mode 100644 index 1043f87..0000000 --- a/src/pages/members/kyc/hooks/useKycContext.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { useContext } from 'react'; -import { ManageKycContext } from './ManageKycContext'; - -const useKycContext = () => { - const context = useContext(ManageKycContext); - - if (!context) throw new Error('useKycContext must be used within AuthProvider'); - - return context; -}; - -export { useKycContext }; From 47db6b8a4d17adc6445f7f99433b83208f0ed64e Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 17 Apr 2025 22:44:22 +0700 Subject: [PATCH 6/7] fix member --- .../members/manage-members/ManageMembers.tsx | 3 +- .../manage-members/blocks/DetailMember.tsx | 117 ++++++++++++------ 2 files changed, 84 insertions(+), 36 deletions(-) diff --git a/src/pages/members/manage-members/ManageMembers.tsx b/src/pages/members/manage-members/ManageMembers.tsx index 3dedff3..0651b82 100644 --- a/src/pages/members/manage-members/ManageMembers.tsx +++ b/src/pages/members/manage-members/ManageMembers.tsx @@ -175,7 +175,8 @@ const ManageMembers = () => { toast.success('Success Create Member. PIN sent to email'); } } catch (error: any) { - toast.error(error.message); + if (error?.response?.data?.message) toast.error(error?.response?.data?.message) + else toast.error(error.message); } finally { setDialogOpen(false); closeDialog(); diff --git a/src/pages/members/manage-members/blocks/DetailMember.tsx b/src/pages/members/manage-members/blocks/DetailMember.tsx index 2ce6b25..1ba2005 100644 --- a/src/pages/members/manage-members/blocks/DetailMember.tsx +++ b/src/pages/members/manage-members/blocks/DetailMember.tsx @@ -41,6 +41,10 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa const [sucos, setSucos] = useState([]); const [groups, setGroups] = useState([]); const [genders] = useState([ { name: 'Male',id: 'M' }, { name: 'Female',id: 'F' }]) + const [previewImg, setPreviewImg] = useState({ + status: false, + img: '' + }); const [banks] = useState([ { name: 'BNCTL',id: 'BNCTL' }, { name: 'BRI',id: 'BRI' }, { name: 'BNU',id: 'BNU' }, { name: 'Mandiri',id: 'Mandiri' } ]) @@ -203,36 +207,44 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa {/* {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Group', 'group_name', 'text', true, true): ''} */} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Username', 'username', 'text', true, dialogType==='create'?false:true): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Full Name', 'fullname', 'text', true, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'Photo', 'photouser'): ''} + {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'Photo', 'photouser', previewImg, setPreviewImg): ''} {(formData.id || dialogType === "create") ? generateList(formData, handleChange, genders, 'gender', 'Gender', true, false): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Date of Birth', 'date_birth', 'date', true, viewOnly): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Phone Number', 'msisdn', 'text', true, dialogType === "update"||false): ''} {(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_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): ''} -
- -
    - {nationality.map((item: any, index) => ( -
  • handleChange({target:{name: 'nationality', value: item.name }})} - className="bg-gray-100 px-4 py-2 rounded hover:bg-gray-200 cursor-default transition"> - {item.name} -
  • - ))} - {formData.nationality && nationality.length === 0 && ( -
  • No results found.
  • - )} -
-
- {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Address', 'address', 'text', true, viewOnly): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Mother Fullname', 'mother_fullname', 'text', true, viewOnly): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Identity Number', 'identity_number', 'text', false, viewOnly): ''} +
+ {(formData.id || dialogType === "create") ? generateList(formData, handleChange, profession, 'profession', 'Profession', 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): ''} +
+ +
    + {nationality.map((item: any, index) => ( +
  • handleChange({target:{name: 'nationality', value: item.name }})} + className="bg-gray-100 px-4 py-2 rounded hover:bg-gray-200 cursor-default transition"> + {item.name} +
  • + ))} + {formData.nationality && nationality.length === 0 && ( +
  • No results found.
  • + )} +
+
+ {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Address', 'address', 'text', true, viewOnly): ''} +
+

Bank Information

+ {(formData.id || dialogType === "create") ? generateList(formData, handleChange, banks, 'bank_name', 'Bank Name', false, false): ''} + {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Bank Account', 'bank_account', 'text', false, viewOnly): ''} + {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'iBank Number', 'ibank_number', 'text', false, viewOnly): ''} +
+

Agent Information

@@ -241,18 +253,13 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Merchant Address', 'merchantaddress', 'text', false, viewOnly): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Longitude Merchant', 'longitudemerchant', 'text', false, viewOnly): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Latitude Merchant', 'latitudemerchant', 'text', false, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Selfie', 'file_selfie'): ''} - {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Document', 'file_document_id'): ''} - {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Document & Selfie', 'file_document_id_selfie'): ''} - {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Commercial License', 'file_commercial_license'): ''} + {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Selfie', 'file_selfie', previewImg, setPreviewImg): ''} + {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Document', 'file_document_id', previewImg, setPreviewImg): ''} + {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Document & Selfie', 'file_document_id_selfie', previewImg, setPreviewImg): ''} + {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Commercial License', 'file_commercial_license', previewImg, setPreviewImg): ''}
-
-

Bank Information

- {(formData.id || dialogType === "create") ? generateList(formData, handleChange, banks, 'bank_name', 'Bank Name', false, false): ''} - {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Bank Account', 'bank_account', 'text', false, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'iBank Number', 'ibank_number', 'text', false, viewOnly): ''} -
+ {(formData.id&&(!page||formData.destinationGroup === "Premium")) ? generateInput(formData, handleChange, 'Approval Premium Description', 'approval_description_premium', 'text', false, viewOnly): ''} {(formData.id&&(!page||formData.destinationGroup === "Agent")) ? generateInput(formData, handleChange, 'Approval Agent Description', 'approval_description_agent', 'text', false, viewOnly): ''} @@ -340,7 +347,7 @@ function generateList(formData:any, handleChange: any, list:any, name:string, la } // ON DEV (UPDATENYA) -function generateImage(formData:any, handleChange:any, label:string, name:string) { +function generateImage(formData:any, handleChange:any, label:string, name:string, previewImg: any, setPreviewImg:any) { const imagePreview = (file:any) => { if (file && file.type && file.type.startsWith('image/')) { const previewURL = URL.createObjectURL(file); @@ -349,8 +356,21 @@ function generateImage(formData:any, handleChange:any, label:string, name:string return file }; + function handlePrevImg(par: boolean) { + if (par) setPreviewImg({ status: true, img: ''}) + if (!par) setPreviewImg({ status: false, img: '' }) + } + + function onClickImg(img: any) { + setPreviewImg({ status: true, img }) + } + return ( <> + {previewImg.status ? ( + + ):''}