diff --git a/pkgs/ui/src/components/table/index.tsx b/pkgs/ui/src/components/table/index.tsx
new file mode 100644
index 0000000..0b389cb
--- /dev/null
+++ b/pkgs/ui/src/components/table/index.tsx
@@ -0,0 +1,66 @@
+import React from "react";
+import Table from '@mui/material/Table';
+import TableBody from '@mui/material/TableBody';
+import TableContainer from '@mui/material/TableContainer';
+import TableHead from '@mui/material/TableHead';
+import TableRow from '@mui/material/TableRow';
+import Paper from '@mui/material/Paper';
+
+import { NoDataOverlay } from "@/components/noDataOverlay";
+import { StyledTableCell, StyledTableRow } from "./style";
+import { ICustomTable, CustomTableConfiguration } from "@/types";
+
+const CustomTable = ({ configuration, data }: ICustomTable) => {
+
+ // display empty icon in case there is no data
+ if (!data || data.length === 0)
+ return
+
+ const renderTableCell = (value: any, cellKey: string, render?: (param: any) => void | undefined) => {
+
+ let renderedValue = value;
+
+ // cover use case if the data is an array
+ if (Array.isArray(value)) renderedValue = value.join(', ')
+
+ // cover use case if we want to render a component
+ if (render) renderedValue = render(value);
+
+ return (
+
+ {renderedValue}
+
+ );
+
+ }
+
+ return (
+
+
+
+
+ {configuration.map((header: CustomTableConfiguration) => (
+
+ {header.label}
+
+ ))}
+
+
+
+ {data.map((data: any, rowIndex: number) => (
+
+ {configuration.map((column: CustomTableConfiguration) => {
+ const cellValue: any = data[column.key];
+ const cellKey = column.key;
+ const renderComponent = column?.render;
+ return renderTableCell(cellValue, cellKey, renderComponent);
+ })}
+
+ ))}
+
+
+
+ )
+}
+
+export default CustomTable;
\ No newline at end of file
diff --git a/pkgs/ui/src/components/table/style.tsx b/pkgs/ui/src/components/table/style.tsx
new file mode 100644
index 0000000..9785f80
--- /dev/null
+++ b/pkgs/ui/src/components/table/style.tsx
@@ -0,0 +1,23 @@
+import { styled } from '@mui/material/styles';
+import TableCell, { tableCellClasses } from '@mui/material/TableCell';
+import TableRow from '@mui/material/TableRow';
+
+export const StyledTableCell = styled(TableCell)(({ theme }) => ({
+ [`&.${tableCellClasses.head}`]: {
+ backgroundColor: theme.palette.common.black,
+ color: theme.palette.common.white,
+ },
+ [`&.${tableCellClasses.body}`]: {
+ fontSize: 14,
+ },
+}));
+
+export const StyledTableRow = styled(TableRow)(({ theme }) => ({
+ '&:nth-of-type(odd)': {
+ backgroundColor: theme.palette.action.hover,
+ },
+ // hide last border
+ '&:last-child td, &:last-child th': {
+ border: 0,
+ },
+}));
\ No newline at end of file
diff --git a/pkgs/ui/src/types/index.ts b/pkgs/ui/src/types/index.ts
new file mode 100644
index 0000000..ca5a5fc
--- /dev/null
+++ b/pkgs/ui/src/types/index.ts
@@ -0,0 +1,10 @@
+export interface CustomTableConfiguration {
+ key: string;
+ label: string;
+ render?: (param: any) => void;
+}
+
+export interface ICustomTable {
+ configuration: CustomTableConfiguration[],
+ data: any
+}
\ No newline at end of file