"use client"; import { useEffect, useState } from "react"; import { Box, Button, IconButton, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography, } from "@mui/material"; import CheckCircleIcon from "@mui/icons-material/CheckCircle"; import CancelIcon from "@mui/icons-material/Cancel"; import MoreVertIcon from "@mui/icons-material/MoreVert"; import { dashboardService } from "@/app/services/dashboardService"; import { formatToDateTimeString } from "@/app/utils/formatDate"; import "./TransactionsWaitingApproval.scss"; import { type IReviewTransactionsData, type IReviewTransaction, } from "@/app/services/types"; import StatusChangeDialog from "../DataTable/StatusChangeDialog"; interface ITransactionsWaitingApprovalProps { initialReviewTransactions?: IReviewTransactionsData | null; } export const TransactionsWaitingApproval = ({ initialReviewTransactions = null, }: ITransactionsWaitingApprovalProps) => { const [reviewTransactions, setReviewTransactions] = useState( initialReviewTransactions || dashboardService.getCurrentDashboardData()?.reviewTransactions || null ); const [statusDialogData, setStatusDialogData] = useState<{ rowId: number; newStatus: string; } | null>(null); /** * Subscribe to dashboard data changes */ useEffect(() => { const subscription = dashboardService .getDashboardData$() .subscribe(data => { if (data?.reviewTransactions) { setReviewTransactions(data.reviewTransactions); } }); // Cleanup subscription on unmount return () => subscription.unsubscribe(); }, []); /** * Format transaction for display */ const formatTransaction = (tx: IReviewTransaction) => { const createdDate = tx.created || tx.modified || ""; const formattedDate = createdDate ? formatToDateTimeString(createdDate) : ""; return { id: tx.id ?? tx.external_id ?? "", user: tx.customer || "", created: formattedDate, type: tx.type || "", amount: tx.amount ? `${tx.amount < 0 ? "-" : ""}${Math.abs(tx.amount).toFixed(2)} ${tx.currency || ""}` : "", psp: tx.psp_id || "", }; }; const transactions = reviewTransactions?.transactions || []; const displayTransactions = transactions.map(formatTransaction); const handleStatusChange = (rowId: number, newStatus: string) => { setStatusDialogData({ rowId, newStatus }); }; return ( Transactions Waiting for Approval {reviewTransactions && ( ID User Created Type Amount PSP Action {displayTransactions.length > 0 ? ( displayTransactions.map((tx, i) => ( {tx.id} {tx.user} {tx.created} {tx.type} {tx.amount} {tx.psp} handleStatusChange(tx.id, "approved")} > handleStatusChange(tx.id, "declined")} > )) ) : ( No transactions waiting for approval )}
)}
setStatusDialogData(null)} />
); };