diff --git a/Client/src/Pages/Uptime/Home/UptimeDataTable/Skeleton/index.jsx b/Client/src/Pages/Uptime/Home/UptimeDataTable/Skeleton/index.jsx
new file mode 100644
index 000000000..c17f6d74b
--- /dev/null
+++ b/Client/src/Pages/Uptime/Home/UptimeDataTable/Skeleton/index.jsx
@@ -0,0 +1,47 @@
+import { Skeleton } from "@mui/material";
+import DataTable from "../../../../../Components/Table";
+const ROWS_NUMBER = 7;
+const ROWS_ARRAY = Array.from({ length: ROWS_NUMBER }, (_, i) => i);
+
+const TableSkeleton = () => {
+ /* TODO Skeleton does not follow light and dark theme */
+
+ const headers = [
+ {
+ id: "name",
+
+ content: "Host",
+
+ render: () => ,
+ },
+ {
+ id: "status",
+ content: "Status",
+ render: () => ,
+ },
+ {
+ id: "responseTime",
+ content: "Response Time",
+ render: () => ,
+ },
+ {
+ id: "type",
+ content: "Type",
+ render: () => ,
+ },
+ {
+ id: "actions",
+ content: "Actions",
+ render: () => ,
+ },
+ ];
+
+ return (
+
+ );
+};
+
+export { TableSkeleton };
diff --git a/Client/src/Pages/Uptime/Home/UptimeDataTable/index.jsx b/Client/src/Pages/Uptime/Home/UptimeDataTable/index.jsx
new file mode 100644
index 000000000..4739b37de
--- /dev/null
+++ b/Client/src/Pages/Uptime/Home/UptimeDataTable/index.jsx
@@ -0,0 +1,231 @@
+// Components
+import { Box, Stack, CircularProgress } from "@mui/material";
+import Search from "../../../../Components/Inputs/Search";
+import { Heading } from "../../../../Components/Heading";
+import DataTable from "../../../../Components/Table";
+import ArrowDownwardRoundedIcon from "@mui/icons-material/ArrowDownwardRounded";
+import ArrowUpwardRoundedIcon from "@mui/icons-material/ArrowUpwardRounded";
+import Host from "../host";
+import { StatusLabel } from "../../../../Components/Label";
+import BarChart from "../../../../Components/Charts/BarChart";
+import ActionsMenu from "../actionsMenu";
+
+// Utils
+import { useTheme } from "@emotion/react";
+import useDebounce from "../../../../Utils/debounce";
+import { useState } from "react";
+import useUtils from "../../utils";
+import { memo } from "react";
+import { useNavigate } from "react-router-dom";
+
+const UptimeDataTable = ({
+ isAdmin,
+ isLoading,
+ monitors,
+ monitorCount,
+ sort,
+ setSort,
+ search,
+ setSearch,
+ isSearching,
+ setIsSearching,
+ triggerUpdate,
+}) => {
+ const { determineState } = useUtils();
+
+ const theme = useTheme();
+ const navigate = useNavigate();
+
+ //Utils
+ const debouncedFilter = useDebounce(search, 500);
+ const handleSearch = (value) => {
+ setIsSearching(true);
+ setSearch(value);
+ };
+
+ const handleSort = (field) => {
+ let order = "";
+ if (sort.field !== field) {
+ order = "desc";
+ } else {
+ order = sort.order === "asc" ? "desc" : "asc";
+ }
+ setSort({ field, order });
+ };
+
+ const headers = [
+ {
+ id: "name",
+ content: (
+ handleSort("name")}>
+ Host
+
+ {sort.order === "asc" ? (
+
+ ) : (
+
+ )}
+
+
+ ),
+ render: (row) => (
+
+ ),
+ },
+ {
+ id: "status",
+ content: (
+ handleSort("status")}
+ >
+ {" "}
+ Status
+
+ {sort.order === "asc" ? (
+
+ ) : (
+
+ )}
+
+
+ ),
+ render: (row) => {
+ const status = determineState(row.monitor);
+ return (
+
+ );
+ },
+ },
+ {
+ id: "responseTime",
+ content: "Response Time",
+ render: (row) => ,
+ },
+ {
+ id: "type",
+ content: "Type",
+ render: (row) => (
+ {row.monitor.type}
+ ),
+ },
+ {
+ id: "actions",
+ content: "Actions",
+ render: (row) => (
+
+ ),
+ },
+ ];
+
+ return (
+
+
+ Uptime monitors
+
+
+ {monitorCount}
+
+
+
+
+
+
+ {isSearching && (
+ <>
+
+
+
+
+ >
+ )}
+ {
+ navigate(`/uptime/${row.id}`);
+ },
+ emptyView: "No monitors found",
+ }}
+ />
+
+
+ );
+};
+
+const MemoizedUptimeDataTable = memo(UptimeDataTable);
+export default MemoizedUptimeDataTable;