diff --git a/src/pages/master/conversion/ConversionMaster.tsx b/src/pages/master/conversion/ConversionMaster.tsx
new file mode 100644
index 0000000..7e8725c
--- /dev/null
+++ b/src/pages/master/conversion/ConversionMaster.tsx
@@ -0,0 +1,32 @@
+import { Container, DataGridInner } from '@/components';
+import { ManageConversionContextProvider } from './hooks/ManageConversionContext';
+import { Breadcrumbs, Link } from '@mui/material';
+
+const ConversionMaster = () => {
+ return (
+
+
+ Conversion
+
+
+ Dashboard
+
+
+
+ Master Data
+
+
+
+ Manage Conversion
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ConversionMaster;
diff --git a/src/pages/master/conversion/blocks/AddDialog.tsx b/src/pages/master/conversion/blocks/AddDialog.tsx
new file mode 100644
index 0000000..e69de29
diff --git a/src/pages/master/conversion/hooks/ManageConversionContext.tsx b/src/pages/master/conversion/hooks/ManageConversionContext.tsx
new file mode 100644
index 0000000..fe96cb0
--- /dev/null
+++ b/src/pages/master/conversion/hooks/ManageConversionContext.tsx
@@ -0,0 +1,177 @@
+import { DataGridColumnHeader, DataGridProvider, KeenIcon } from '@/components';
+import { Toaster } from '@/components/ui/sonner';
+import { apiConfig } from '@/config/api.config';
+import { useCallApi } from '@/hooks';
+import { ColumnDef } from '@tanstack/react-table';
+import { createContext, useCallback, useMemo, useState } from 'react';
+import ListToolbar from '../blocks/ListToolbar';
+
+interface ConversionProps {
+ id: string;
+ name: string;
+}
+
+interface ContextProps {
+ conversion: ConversionProps[];
+ showAddDialog: boolean;
+ handleAddDialog: (show: boolean) => void;
+ showEditDialog: boolean;
+ handleEditDialog: (show: boolean, selected_conversion: string | null) => void;
+ showDeleteDialog: boolean;
+ handleDeleteDialog: (show: boolean, selected_conversion: string | null) => void;
+ selectedConversion: string | null;
+ getConversionLists: (
+ limit: number,
+ page: number,
+ with_deleted: boolean,
+ order_field: any,
+ order_direction: any
+ ) => Promise<{ data: ConversionProps[]; totalCount: number } | undefined>;
+}
+
+const initialProps: ContextProps = {
+ conversion: [],
+ showAddDialog: false,
+ handleAddDialog: () => {},
+ showEditDialog: false,
+ handleEditDialog: () => {},
+ showDeleteDialog: false,
+ handleDeleteDialog: () => {},
+ selectedConversion: null,
+ getConversionLists: async () => undefined
+};
+
+const ManageConversionContext = createContext(initialProps);
+const API_URL_WALLET = apiConfig.service_wallet;
+
+const ManageConversionContextProvider = ({ children }: { children: React.ReactNode }) => {
+ const [conversions, setConversions] = useState([]);
+ const [showAddDialog, setShowAddDialog] = useState(false);
+ const [showEditDialog, setShowEditDialog] = useState(false);
+ const [showDeleteDialog, setShowDeleteDialog] = useState(false);
+ const [selectedConversion, setSelectedConversion] = useState(null);
+ const { GetData } = useCallApi();
+
+ const handleAddDialog = useCallback((show: boolean) => {
+ setShowAddDialog(show);
+ }, []);
+
+ const handleEditDialog = useCallback((show: boolean, selected_conversion: string | null) => {
+ setShowEditDialog(show);
+ setSelectedConversion(show ? selected_conversion : null);
+ }, []);
+
+ const handleDeleteDialog = useCallback((show: boolean, selected_conversion: string | null) => {
+ setShowEditDialog(show);
+ setSelectedConversion(show ? selected_conversion : null);
+ }, []);
+
+ const columns = useMemo[]>(
+ () => [
+ {
+ accessorFn: (row) => row.id,
+ id: 'id',
+ header: ({ column }) => ,
+ enableSorting: true,
+ enableHiding: false,
+ meta: {
+ headerClassName: 'w-[100px]'
+ }
+ },
+ {
+ accessorFn: (row) => row.name,
+ id: 'name',
+ header: ({ column }) => ,
+ enableSorting: true,
+ enableHiding: false,
+ meta: {
+ headerClassName: 'w-[250px]'
+ }
+ },
+ {
+ id: 'actions',
+ header: ({ column }) => ,
+ enableSorting: false,
+ enableHiding: false,
+ cell: (data) => {
+ const row = data.row.original;
+ return (
+ <>
+
+
+ >
+ );
+ },
+ meta: {
+ headerClassName: 'w-[100px]',
+ cellClassName: 'text-center'
+ }
+ }
+ ],
+ []
+ );
+
+ const getConversionLists = async (page: number, limit: number, sorting: any, filter: any) => {
+ try {
+ sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting;
+ filter = filter.length == 0 ? {} : { any: filter[0].value?.toLowerCase() };
+ const response = await GetData(`${API_URL_WALLET}/dashboard/conversion`, {
+ limit,
+ page: page + 1,
+ with_deleted: false,
+ order_field: sorting[0].id,
+ order_direction: sorting[0].desc == false ? 'ASC' : 'DESC',
+ filter: JSON.stringify(filter)
+ });
+ console.log(response?.data);
+ setConversions(response?.data.list);
+ return { data: response?.data.list, totalCount: response?.data.total_count };
+ } catch (error) {
+ console.error('Error fetching Conversion', error);
+ }
+ };
+
+ return (
+
+
+ }
+ layout={{ card: true }}
+ sorting={[{ id: 'id', desc: false }]}
+ serverSide={true}
+ onFetchData={({ pageIndex, pageSize, sorting, columnFilters }) =>
+ getConversionLists(pageIndex, pageSize, sorting, columnFilters)
+ }
+ >
+ {children}
+
+
+ );
+};
+
+export { ManageConversionContext, ManageConversionContextProvider };
+export type { ConversionProps };
diff --git a/src/pages/master/conversion/hooks/useManageConversionContext.tsx b/src/pages/master/conversion/hooks/useManageConversionContext.tsx
new file mode 100644
index 0000000..cf6c60b
--- /dev/null
+++ b/src/pages/master/conversion/hooks/useManageConversionContext.tsx
@@ -0,0 +1,12 @@
+import { useContext } from 'react';
+import { ManageConversionContext } from './ManageConversionContext';
+
+const useManageConversionContext = () => {
+ const context = useContext(ManageConversionContext);
+
+ if (!context) throw new Error('useManageConversionContext must be used within AuthProvider');
+
+ return context;
+};
+
+export { useManageConversionContext };