diff --git a/src/config/api.config.ts b/src/config/api.config.ts index 4025a2e..4df59e9 100644 --- a/src/config/api.config.ts +++ b/src/config/api.config.ts @@ -8,10 +8,12 @@ interface apiConfigProps { nationality: string; service_disbursement: string; service_notification: string; + service_feedback: string; } const API_URL = import.meta.env.VITE_APP_API_URL; const apiConfig: apiConfigProps = { + service_feedback: `${API_URL}/k`, // service_dashboard: `${API_URL}${import.meta.env.VITE_ENV != 'development' ? '/d' : ''}`, service_dashboard: `${API_URL}/d`, service_customer: `${API_URL}/c`, diff --git a/src/pages/members/feedback-member/FeedbackMember.tsx b/src/pages/members/feedback-member/FeedbackMember.tsx new file mode 100644 index 0000000..d8d8810 --- /dev/null +++ b/src/pages/members/feedback-member/FeedbackMember.tsx @@ -0,0 +1,40 @@ +import { Container, DataGridInner } from '@/components'; +import { ManageFeedbackMemberProvider } from './hooks/ManageFeedbackMemberContext'; +// import EditDialog from './blocks/EditDialog'; +// import DeleteDialog from './blocks/DeleteDialog'; +import { Breadcrumbs, Link } from '@mui/material'; +import { Helmet } from 'react-helmet'; + +const FeedbackMemberMaster = () => { + return ( + <> + TPAY | Manage Provider + + +

Manage Feedback Member

+ + + Dashboard + + + + Member + + + + Manage Feedback Member + + +
+ +
+ {/* + + */} +
+
+ + ); +}; + +export default FeedbackMemberMaster; diff --git a/src/pages/members/feedback-member/hooks/ManageFeedbackMemberContext.tsx b/src/pages/members/feedback-member/hooks/ManageFeedbackMemberContext.tsx new file mode 100644 index 0000000..9e1a9de --- /dev/null +++ b/src/pages/members/feedback-member/hooks/ManageFeedbackMemberContext.tsx @@ -0,0 +1,205 @@ +import { DataGridColumnHeader, DataGridProvider, KeenIcon } from '@/components'; +import { apiConfig } from '@/config/api.config'; +import { useCallApi } from '@/hooks'; +import { ColumnDef } from '@tanstack/react-table'; +import React, { createContext, useCallback, useMemo, useState } from 'react'; +import { Toaster } from 'sonner'; +// import ListToolbar from '../blocks/ListToolbar'; + +interface feedbackProps { + id: string; + name: string; + description: string; + type: string; + status: string; + transactionTypeId: string; + agentId: string; +} + +interface ContextProps { + feedback: feedbackProps[]; + showEditDialog: boolean; + handleEditDialog: (show: boolean, selected_sucos: string | null) => void; + showAddDialog: boolean; + handleAddDialog: (show: boolean) => void; + showDeleteDialog: boolean; + handleDeleteDialog: (show: boolean, selected_sucos: string | null) => void; + selectedfeedback: string | null; + getfeedbackLists: ( + limit: number, + page: number, + with_deleted: boolean, + order_field: any, + order_direction: any + ) => Promise<{ data: feedbackProps[]; totalCount: number } | undefined>; +} + +const initialProps: ContextProps = { + feedback: [], + showEditDialog: false, + handleEditDialog: () => {}, + showAddDialog: false, + handleAddDialog: () => {}, + showDeleteDialog: false, + handleDeleteDialog: () => {}, + selectedfeedback: null, + getfeedbackLists: async () => undefined +}; + +const ManageFeedbackMemberContext = createContext(initialProps); +const API_URL = apiConfig.service_feedback; + +const ManageFeedbackMemberProvider = ({ children }: { children: React.ReactNode }) => { + const [feedback, setFeedback] = useState([]); + const [showAddDialog, setShowAddDialog] = useState(false); + const [showEditDialog, setShowEditDialog] = useState(false); + const [showDeleteDialog, setShowDeleteDialog] = useState(false); + const [selectedfeedback, setSelectedfeedback] = useState(null); + const { GetData } = useCallApi(); + + const handleAddDialog = useCallback((show: boolean) => { + setShowAddDialog(show); + }, []); + + const handleEditDialog = useCallback((show: boolean, selected_feedback: string | null) => { + setShowEditDialog(show); + setSelectedfeedback(show ? selected_feedback : null); + }, []); + + const handleDeleteDialog = useCallback((show: boolean, selected_feedback: string | null) => { + setShowDeleteDialog(show); + setSelectedfeedback(show ? selected_feedback : null); + }, []); + + const columns = useMemo[]>( + () => [ + { + accessorFn: (row) => row.feedback_notes, + id: 'feedback_notes', + header: ({ column }) => , + enableSorting: false, + enableHiding: false, + meta: { + headerClassName: 'w-[250px]' + } + }, + { + accessorFn: (row) => row.feedback_screenshot, + id: 'feedback_screenshot', + header: ({ column }) => , + enableSorting: false, + enableHiding: false, + meta: { + headerClassName: 'w-[250px]' + } + }, + { + accessorFn: (row) => row.review_notes, + id: 'review_notes', + header: ({ column }) => , + enableSorting: false, + enableHiding: false, + meta: { + headerClassName: 'w-[250px]' + } + }, + { + accessorFn: (row) => row.review_screenshot, + id: 'review_screenshot', + header: ({ column }) => , + enableSorting: false, + 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] text-center', + // cellClassName: 'text-center' + // } + // } + ], + [handleEditDialog, handleDeleteDialog] + ); + + const getfeedbackLists = 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}/feedback/list`, { + 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); + setFeedback(response?.data.list); + return { data: response?.data.list, totalCount: response?.data.total_count }; + } catch (error) { + console.error('Error fetching Feedback Member', error); + } + }; + + + return ( + + + + } + layout={{ card: true }} + sorting={[{ id: 'created_at', desc: true }]} + serverSide={true} + onFetchData={({ pageIndex, pageSize, sorting, columnFilters }) => + getfeedbackLists(pageIndex, pageSize, sorting, columnFilters) + } + > + {children} + + + ); +}; + +export { ManageFeedbackMemberContext, ManageFeedbackMemberProvider}; +export type { feedbackProps }; diff --git a/src/pages/members/feedback-member/hooks/useManageFeedbackMemberContext.tsx b/src/pages/members/feedback-member/hooks/useManageFeedbackMemberContext.tsx new file mode 100644 index 0000000..e45bbc7 --- /dev/null +++ b/src/pages/members/feedback-member/hooks/useManageFeedbackMemberContext.tsx @@ -0,0 +1,12 @@ +import { useContext } from 'react'; +import { ManageFeedbackMemberContext } from './ManageFeedbackMemberContext'; + +const useManageProviderContext = () => { + const context = useContext(ManageFeedbackMemberContext); + + if (!context) throw new Error('useManageProviderContext must be used within AuthProvider'); + + return context; +}; + +export { useManageProviderContext }; diff --git a/src/routing/AppRoutingSetup.tsx b/src/routing/AppRoutingSetup.tsx index 786cd1e..fbb889e 100644 --- a/src/routing/AppRoutingSetup.tsx +++ b/src/routing/AppRoutingSetup.tsx @@ -42,9 +42,10 @@ import WalletRuleMaster from '@/pages/master/walletRule/WalletRuleMaster'; import WalletHistory from '@/pages/wallet/wallet-history/WalletHistory'; import WalletMaster from '@/pages/master/wallet/WalletMaster'; import CurrencyMaster from '@/pages/master/currency/CurrencyMaster'; +import FeedbackMemberMaster from '@/pages/members/feedback-member/FeedbackMember'; // DISBURSEMENT -import HistoryTransactionDisbursement from '@/pages/disbursement/history-transaction/HistoryTransaction' +import HistoryTransactionDisbursement from '@/pages/disbursement/history-transaction/HistoryTransaction'; // DISBURSEMENT const AppRoutingSetup = (): ReactElement => { @@ -84,6 +85,7 @@ const AppRoutingSetup = (): ReactElement => { } /> } /> } /> + } /> } /> @@ -98,8 +100,8 @@ const AppRoutingSetup = (): ReactElement => { } /> } /> - } /> - } /> + } /> + } /> } /> } /> } /> @@ -112,9 +114,11 @@ const AppRoutingSetup = (): ReactElement => { /> {/* DISBURSEMENT */} - } /> + } + /> {/* DISBURSEMENT */} - } />