"use client"; import React, { useState, useMemo } from "react"; import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid"; import { Box, Paper, IconButton, Alert } from "@mui/material"; import OpenInNewIcon from "@mui/icons-material/OpenInNew"; import StatusChangeDialog from "./StatusChangeDialog"; import DataTableHeader from "./DataTableHeader"; import { TABLE_COLUMNS } from "./constants"; import Spinner from "@/app/components/Spinner/Spinner"; import { useSelector } from "react-redux"; import { selectStatus, selectError } from "@/app/redux/auth/selectors"; interface IDataTableProps { rows: TRow[]; extraColumns?: string[]; } const DataTable = ({ rows, extraColumns, }: IDataTableProps) => { const [modalOpen, setModalOpen] = useState(false); const [selectedRowId, setSelectedRowId] = useState(null); const [newStatus, setNewStatus] = useState(""); const [reason, setReason] = useState(""); const [showExtraColumns, setShowExtraColumns] = useState(false); const status = useSelector(selectStatus); const errorMessage = useSelector(selectError); // Open status modal const handleStatusChange = (id: number, status: string) => { setSelectedRowId(id); setNewStatus(status); setModalOpen(true); }; const handleStatusSave = () => { setModalOpen(false); setReason(""); // rows update should happen in parent component }; // Columns filtered by extraColumns toggle const visibleColumns = useMemo(() => { if (!extraColumns || extraColumns.length === 0) return TABLE_COLUMNS; return showExtraColumns ? TABLE_COLUMNS : TABLE_COLUMNS.filter(col => !extraColumns.includes(col.field)); }, [extraColumns, showExtraColumns]); // Columns with custom renderers const enhancedColumns = useMemo(() => { return visibleColumns.map(col => { if (col.field === "status") { return { ...col, renderCell: (params: GridRenderCellParams) => { const value = params.value?.toLowerCase(); let bgColor = "#e0e0e0"; let textColor = "#000"; switch (value) { case "completed": bgColor = "#d0f0c0"; textColor = "#1b5e20"; break; case "pending": bgColor = "#fff4cc"; textColor = "#9e7700"; break; case "inprogress": bgColor = "#cce5ff"; textColor = "#004085"; break; case "error": bgColor = "#ffcdd2"; textColor = "#c62828"; break; } return ( {params.value} ); }, }; } if (col.field === "userId") { return { ...col, headerAlign: "center", align: "center", renderCell: (params: GridRenderCellParams) => ( e.stopPropagation()} > {params.value} e.stopPropagation()} > ), }; } return col; }); }, [visibleColumns]); return ( <> {status === "loading" && } {status === "failed" && ( {errorMessage || "Failed to load transactions."} )} setShowExtraColumns(prev => !prev)} onOpenExport={() => {}} /> setModalOpen(false)} handleSave={handleStatusSave} /> ); }; // Memoize to avoid unnecessary re-renders export default React.memo(DataTable);