From d55823b7b364e7845eb25c8b0c45dc0e499b1a26 Mon Sep 17 00:00:00 2001 From: Wikzyy Date: Mon, 24 Feb 2025 10:48:09 +0700 Subject: [PATCH] feat: add members kyc page --- src/pages/groups/Column.tsx | 3 +- src/pages/members/kyc/Kyc.tsx | 42 +++++ src/pages/members/kyc/blocks/ListToolBar.tsx | 55 +++++++ .../members/kyc/hooks/ManageKycContext.tsx | 145 ++++++++++++++++++ src/pages/members/kyc/hooks/index.ts | 2 + .../members/kyc/hooks/useManageKycContext.tsx | 12 ++ .../manage-members}/Columns.tsx | 0 .../manage-members}/ManageMembers.tsx | 0 src/routing/AppRoutingSetup.tsx | 4 +- 9 files changed, 261 insertions(+), 2 deletions(-) create mode 100644 src/pages/members/kyc/Kyc.tsx create mode 100644 src/pages/members/kyc/blocks/ListToolBar.tsx create mode 100644 src/pages/members/kyc/hooks/ManageKycContext.tsx create mode 100644 src/pages/members/kyc/hooks/index.ts create mode 100644 src/pages/members/kyc/hooks/useManageKycContext.tsx rename src/pages/{account/manage/members => members/manage-members}/Columns.tsx (100%) rename src/pages/{account/manage/members => members/manage-members}/ManageMembers.tsx (100%) diff --git a/src/pages/groups/Column.tsx b/src/pages/groups/Column.tsx index bcd9476..234809a 100644 --- a/src/pages/groups/Column.tsx +++ b/src/pages/groups/Column.tsx @@ -14,7 +14,8 @@ export const columns: ColumnDef[] = [ }, { accessorKey: 'createdDate', - header: 'Created Date' + header: 'Created Date', + cell: ({ row }) => new Date(row.original.createdDate).toLocaleDateString() }, { accessorKey: 'name', diff --git a/src/pages/members/kyc/Kyc.tsx b/src/pages/members/kyc/Kyc.tsx new file mode 100644 index 0000000..50fc1a2 --- /dev/null +++ b/src/pages/members/kyc/Kyc.tsx @@ -0,0 +1,42 @@ +import { DataGridInner, TDataGridProps } from '@/components'; +import { Table } from '@tanstack/react-table'; +import React, { createContext, useContext, useState } from 'react'; +import { ManageKycContextProvider } from './hooks'; + +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; +}; + +const Kyc = () => { + const [loading, setLoading] = useState(false); + + return ( +
+
+

Manage Member KYC

+ +
+ +
+
+
+
+ ); +}; + +export default Kyc; diff --git a/src/pages/members/kyc/blocks/ListToolBar.tsx b/src/pages/members/kyc/blocks/ListToolBar.tsx new file mode 100644 index 0000000..f337df8 --- /dev/null +++ b/src/pages/members/kyc/blocks/ListToolBar.tsx @@ -0,0 +1,55 @@ +import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components'; +import { Button } from '@/components/ui/button'; +import { useKycContext } from '../hooks'; + +const ListToolBar = () => { + const { table, reload } = useDataGrid(); + const { handleDetailDialog, handleAddDialog } = useKycContext(); + + return ( +
+
+
+
+ + + + +
+
+ + + + +
+
+
+
+ ); +}; + +export { ListToolBar }; diff --git a/src/pages/members/kyc/hooks/ManageKycContext.tsx b/src/pages/members/kyc/hooks/ManageKycContext.tsx new file mode 100644 index 0000000..2a63fe1 --- /dev/null +++ b/src/pages/members/kyc/hooks/ManageKycContext.tsx @@ -0,0 +1,145 @@ +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 new file mode 100644 index 0000000..7e05097 --- /dev/null +++ b/src/pages/members/kyc/hooks/index.ts @@ -0,0 +1,2 @@ +export * from './ManageKycContext'; +export * from './useManageKycContext'; diff --git a/src/pages/members/kyc/hooks/useManageKycContext.tsx b/src/pages/members/kyc/hooks/useManageKycContext.tsx new file mode 100644 index 0000000..1043f87 --- /dev/null +++ b/src/pages/members/kyc/hooks/useManageKycContext.tsx @@ -0,0 +1,12 @@ +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 }; diff --git a/src/pages/account/manage/members/Columns.tsx b/src/pages/members/manage-members/Columns.tsx similarity index 100% rename from src/pages/account/manage/members/Columns.tsx rename to src/pages/members/manage-members/Columns.tsx diff --git a/src/pages/account/manage/members/ManageMembers.tsx b/src/pages/members/manage-members/ManageMembers.tsx similarity index 100% rename from src/pages/account/manage/members/ManageMembers.tsx rename to src/pages/members/manage-members/ManageMembers.tsx diff --git a/src/routing/AppRoutingSetup.tsx b/src/routing/AppRoutingSetup.tsx index 021c776..fb49b36 100644 --- a/src/routing/AppRoutingSetup.tsx +++ b/src/routing/AppRoutingSetup.tsx @@ -13,7 +13,8 @@ import LogActivityPage from '@/pages/settings/user/log-activity/LogActivityPage' import ManagePositionPage from '@/pages/settings/user/manage-position/ManagePositionPage'; import ManageAccount from '@/pages/account/manage/account/ManageAccount'; import ManageGroups from '@/pages/groups/ManageGroups'; -import ManageMembers from '@/pages/account/manage/members/ManageMembers'; +import ManageMembers from '@/pages/members/manage-members/ManageMembers'; +import Kyc from '@/pages/members/kyc/Kyc'; const AppRoutingSetup = (): ReactElement => { return ( @@ -22,6 +23,7 @@ const AppRoutingSetup = (): ReactElement => { }> } /> } /> + } /> } />