"use client"; import { useState, useEffect, useMemo } from "react"; import { Box, TextField, IconButton, InputAdornment, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Checkbox, Paper, MenuItem, InputLabel, Select, FormControl, SelectChangeEvent, debounce, } from "@mui/material"; import SearchIcon from "@mui/icons-material/Search"; import { useRouter, useSearchParams } from "next/navigation"; export interface TableColumn { field: keyof T | string; headerName: string; render?: (value: unknown, row: T) => React.ReactNode; } interface MenuItemOption { value: string; label?: string; } interface DynamicTableProps { data: { rows: T[]; columns: TableColumn[]; actions: MenuItemOption[]; }; searchParamKey?: string; } export function ApproveTable({ data, searchParamKey = "merchantId", }: DynamicTableProps) { const { rows, columns, actions } = data; const router = useRouter(); const searchParams = useSearchParams(); const [selected, setSelected] = useState<(string | number)[]>([]); const [search, setSearch] = useState(""); useEffect(() => { const urlValue = searchParams.get(searchParamKey) ?? ""; setSearch(urlValue); }, [searchParams, searchParamKey]); const updateURL = useMemo( () => debounce((value: string) => { const params = new URLSearchParams(searchParams.toString()); if (value) params.set(searchParamKey, value); else params.delete(searchParamKey); router.replace(`?${params.toString()}`, { scroll: false }); }, 400), [router, searchParams, searchParamKey], ); const handleSearchChange = (e: React.ChangeEvent) => { const value = e.target.value; setSearch(value); updateURL(value); }; const handleCheckboxChange = (id: string | number, checked: boolean) => { setSelected((prev) => checked ? [...prev, id] : prev.filter((x) => x !== id), ); }; const handleToggleAll = (checked: boolean) => { setSelected(checked ? rows.map((r) => r.id) : []); }; const [action, setAction] = useState(""); const handleActionChange = (e: SelectChangeEvent) => { const selectedAction = e.target.value; setAction(selectedAction); if (selected.length > 0) { console.log("Selected Ids", selected); console.log("Selected Action:", selectedAction); } else { console.warn("No rows selected for action:", selectedAction); } }; return ( ), }} /> Action 0} indeterminate={ selected.length > 0 && selected.length < rows.length } onChange={(e) => handleToggleAll(e.target.checked)} /> {columns.map((col, i) => ( {col.headerName} ))} {rows.map((row, idx) => ( handleCheckboxChange(row.id, e.target.checked) } /> {columns.map((col, colIdx) => ( {col.render ? col.render(row[col.field as keyof T], row) : (row[col.field as keyof T] as React.ReactNode)} ))} ))}
); }