diff --git a/client/src/Components/v1/ArrowLeft/index.jsx b/client/src/Components/v1/ArrowLeft/index.jsx
deleted file mode 100644
index e18a7f2d5..000000000
--- a/client/src/Components/v1/ArrowLeft/index.jsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import Icon from "../Icon";
-import PropTypes from "prop-types";
-
-const ArrowLeft = ({ type, color = "#667085", ...props }) => {
- if (type === "double") {
- return (
-
- );
- } else if (type === "long") {
- return (
-
- );
- } else {
- return (
-
- );
- }
-};
-
-ArrowLeft.propTypes = {
- color: PropTypes.string,
- type: PropTypes.oneOf(["double", "long", "default"]),
-};
-export default ArrowLeft;
diff --git a/client/src/Components/v1/Avatar/index.css b/client/src/Components/v1/Avatar/index.css
deleted file mode 100644
index e69de29bb..000000000
diff --git a/client/src/Components/v1/Avatar/index.jsx b/client/src/Components/v1/Avatar/index.jsx
deleted file mode 100644
index d089080ff..000000000
--- a/client/src/Components/v1/Avatar/index.jsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import { Avatar as MuiAvatar } from "@mui/material";
-import PropTypes from "prop-types";
-import { useSelector } from "react-redux";
-import { useEffect, useState } from "react";
-import { useTheme } from "@emotion/react";
-/**
- * @component
- * @param {Object} props
- * @param {string} props.src - Path to image for avatar
- * @param {boolean} props.small - Specifies if avatar should be large
- * @param {Object} [props.sx] - Additional styles to apply to the button.
- * @returns {JSX.Element}
- * @example
- * // Render a red label
- *
- */
-
-const Avatar = ({ src, small, sx, onClick = () => {} }) => {
- const { user } = useSelector((state) => state.auth);
- const theme = useTheme();
-
- const style = small ? { width: 32, height: 32 } : { width: 64, height: 64 };
- const border = small ? 1 : 3;
-
- const [image, setImage] = useState();
- useEffect(() => {
- if (user.avatarImage) {
- setImage(`data:image/png;base64,${user.avatarImage}`);
- }
- }, [user?.avatarImage]);
-
- return (
-
- {user.firstName?.charAt(0)}
- {user.lastName?.charAt(0) || ""}
-
- );
-};
-
-Avatar.propTypes = {
- src: PropTypes.string,
- small: PropTypes.bool,
- sx: PropTypes.object,
- onClick: PropTypes.func,
-};
-
-export default Avatar;
diff --git a/client/src/Components/v1/Label/index.css b/client/src/Components/v1/Label/index.css
deleted file mode 100644
index d3fe53da5..000000000
--- a/client/src/Components/v1/Label/index.css
+++ /dev/null
@@ -1,6 +0,0 @@
-.label {
- display: inline-flex;
- justify-content: center;
- align-items: center;
- line-height: normal;
-}
diff --git a/client/src/Components/v1/Label/index.jsx b/client/src/Components/v1/Label/index.jsx
deleted file mode 100644
index 2ed9b93bf..000000000
--- a/client/src/Components/v1/Label/index.jsx
+++ /dev/null
@@ -1,172 +0,0 @@
-import PropTypes from "prop-types";
-import { Box } from "@mui/material";
-import { useTheme } from "@mui/material";
-import "./index.css";
-
-/**
- * @typedef {Object} Styles
- * @param {string} [color] - The text color
- * @param {string} [backgroundColor] - The background color
- * @param {string} [borderColor] - The border color
- */
-
-/**
- * @component
- * @param {Object} props
- * @param {string} props.label - The label of the label
- * @param {Styles} props.styles - CSS Styles passed from parent component
- * @param {React.ReactNode} children - Children passed from parent component
- * @returns {JSX.Element}
- */
-
-const BaseLabel = ({ label, styles, children }) => {
- const theme = useTheme();
- // Grab the default borderRadius from the theme to match button style
- const { borderRadius } = theme.shape;
- // Calculate padding for the label to mimic button. Appears to scale correctly, not 100% sure though.
- const padding = theme.spacing(3, 5);
-
- return (
-
- {children}
- {label}
-
- );
-};
-
-BaseLabel.propTypes = {
- label: PropTypes.string.isRequired,
- styles: PropTypes.shape({
- color: PropTypes.string,
- backgroundColor: PropTypes.string,
- }),
- children: PropTypes.node,
-};
-
-// Produces a lighter color based on a hex color and a percent
-// lightenColor("#067647", 20) will produce a color 20% lighter than #067647
-const lightenColor = (color, percent) => {
- let r = parseInt(color.substring(1, 3), 16);
- let g = parseInt(color.substring(3, 5), 16);
- let b = parseInt(color.substring(5, 7), 16);
-
- const amt = Math.round((255 * percent) / 100);
-
- r = r + amt <= 255 ? r + amt : 255;
- g = g + amt <= 255 ? g + amt : 255;
- b = b + amt <= 255 ? b + amt : 255;
-
- r = r.toString(16).padStart(2, "0");
- g = g.toString(16).padStart(2, "0");
- b = b.toString(16).padStart(2, "0");
-
- return `#${r}${g}${b}`;
-};
-
-/**
- * @component
- * @param {Object} props
- * @param {string} props.label - The label of the label
- * @param {string} props.color - The color of the label, specified in #RRGGBB format
- * @returns {JSX.Element}
- * @example
- * // Render a red label
- *
- */
-
-const ColoredLabel = ({ label, color }) => {
- const theme = useTheme();
- // If an invalid color is passed, default to the labelGray color
- if (typeof color !== "string" || !/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(color)) {
- color = theme.palette.primary.lowContrast;
- }
-
- // Calculate lighter shades for border and bg
- const borderColor = lightenColor(color, 20);
- const bgColor = lightenColor(color, 75);
-
- return (
-
- );
-};
-
-ColoredLabel.propTypes = {
- label: PropTypes.string.isRequired,
- color: PropTypes.string.isRequired,
-};
-
-/**
- * @component
- * @param {Object} props
- * @param {'up' | 'down' | 'paused' | 'pending' | 'cannot resolve' | 'published' | 'unpublished'} props.status - The status for the label
- * @param {string} props.text - The text of the label
- * @returns {JSX.Element}
- * @example
- * // Render an active label
- *
- */
-
-const statusToTheme = {
- up: "success",
- down: "error",
- paused: "warning",
- pending: "warning",
- "cannot resolve": "error",
- published: "success",
- unpublished: "error",
-};
-
-const StatusLabel = ({ status, text, customStyles }) => {
- const theme = useTheme();
-
- const themeColor = statusToTheme[status];
-
- return (
-
-
-
- );
-};
-
-StatusLabel.propTypes = {
- status: PropTypes.oneOf([
- "up",
- "down",
- "paused",
- "pending",
- "cannot resolve",
- "published",
- "unpublished",
- ]),
- text: PropTypes.string,
- customStyles: PropTypes.object,
-};
-
-export { BaseLabel, ColoredLabel, StatusLabel };
diff --git a/client/src/Components/v1/Layouts/HomeLayout/index.css b/client/src/Components/v1/Layouts/HomeLayout/index.css
deleted file mode 100644
index 61808aa57..000000000
--- a/client/src/Components/v1/Layouts/HomeLayout/index.css
+++ /dev/null
@@ -1,29 +0,0 @@
-.home-layout {
- position: relative;
- min-height: 100vh;
- margin: 0 auto;
- padding: 0;
- overflow-x: hidden;
- width: 100%;
-}
-
-/* TODO go for this approach for responsiveness. The aside needs to be taken care of */
-/* @media (max-width: 1000px) {
- .home-layout {
- flex-direction: column !important;
- }
-} */
-
-.home-layout > .home-content-wrapper {
- min-height: calc(100vh - var(--env-var-spacing-2) * 2);
- flex: 1;
-}
-
-.home-content-wrapper {
- padding: var(--env-var-spacing-2);
- max-width: 1400px;
- margin: 0 auto;
- flex: 1;
- min-width: 0;
- overflow-x: hidden;
-}
diff --git a/client/src/Components/v1/Layouts/HomeLayout/index.jsx b/client/src/Components/v1/Layouts/HomeLayout/index.jsx
deleted file mode 100644
index adadf638f..000000000
--- a/client/src/Components/v1/Layouts/HomeLayout/index.jsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import Sidebar from "../../Sidebar/index.jsx";
-import { Outlet } from "react-router";
-import { Box, Stack } from "@mui/material";
-import { useSidebar } from "@/Hooks/useSidebar.js";
-
-import "./index.css";
-
-const HomeLayout = () => {
- const { width, transition } = useSidebar();
-
- return (
-
-
-
-
-
-
-
- );
-};
-
-export default HomeLayout;
diff --git a/client/src/Components/v1/Sidebar/components/authFooter.jsx b/client/src/Components/v1/Sidebar/components/authFooter.jsx
deleted file mode 100644
index 16b60d9f2..000000000
--- a/client/src/Components/v1/Sidebar/components/authFooter.jsx
+++ /dev/null
@@ -1,276 +0,0 @@
-import Stack from "@mui/material/Stack";
-import Box from "@mui/material/Box";
-import Typography from "@mui/material/Typography";
-import Tooltip from "@mui/material/Tooltip";
-import IconButton from "@mui/material/IconButton";
-import Avatar from "../../Avatar/index.jsx";
-import Menu from "@mui/material/Menu";
-import MenuItem from "@mui/material/MenuItem";
-import Divider from "@mui/material/Divider";
-import Icon from "../../Icon";
-
-import { useTheme } from "@emotion/react";
-import { useSelector } from "react-redux";
-import { useTranslation } from "react-i18next";
-import { useState } from "react";
-import { useNavigate } from "react-router";
-import { clearAuthState } from "../../../../Features/Auth/authSlice.js";
-import { useDispatch } from "react-redux";
-import PropTypes from "prop-types";
-
-const getFilteredAccountMenuItems = (user, items) => {
- if (!user) return [];
-
- let filtered = [...items];
-
- if (user.role?.includes("demo")) {
- filtered = filtered.filter((item) => item.name !== "Password");
- }
-
- if (!user.role?.includes("superadmin")) {
- filtered = filtered.filter((item) => item.name !== "Team");
- }
-
- return filtered;
-};
-
-const getRoleDisplayText = (user, t) => {
- if (!user?.role) return "";
-
- if (user.role.includes("superadmin")) return t("roles.superAdmin");
- if (user.role.includes("admin")) return t("roles.admin");
- if (user.role.includes("user")) return t("roles.teamMember");
- if (user.role.includes("demo")) return t("roles.demoUser");
-
- return user.role;
-};
-
-const AuthFooter = ({ collapsed, accountMenuItems }) => {
- const { t } = useTranslation();
- const theme = useTheme();
- const authState = useSelector((state) => state.auth);
- const navigate = useNavigate();
- const dispatch = useDispatch();
-
- const [anchorEl, setAnchorEl] = useState(null);
-
- const openPopup = (event) => {
- setAnchorEl(event.currentTarget);
- };
-
- const closePopup = () => {
- setAnchorEl(null);
- };
-
- const logout = async () => {
- dispatch(clearAuthState());
- navigate("/login");
- };
- const renderAccountMenuItems = (user, items) => {
- const filteredItems = getFilteredAccountMenuItems(user, items);
-
- return filteredItems.map((item) => (
-
- ));
- };
- return (
-
- collapsed && openPopup(e)}
- sx={{
- cursor: collapsed ? "pointer" : "default",
- }}
- />
-
-
-
-
- {authState.user?.firstName} {authState.user?.lastName}
-
-
- {getRoleDisplayText(authState.user, t)}
-
-
-
- openPopup(event)}
- >
-
-
-
-
-
-
- );
-};
-
-AuthFooter.propTypes = {
- collapsed: PropTypes.bool,
- accountMenuItems: PropTypes.array,
-};
-
-export default AuthFooter;
diff --git a/client/src/Components/v1/Sidebar/components/collapseButton.jsx b/client/src/Components/v1/Sidebar/components/collapseButton.jsx
deleted file mode 100644
index e3a9c91f5..000000000
--- a/client/src/Components/v1/Sidebar/components/collapseButton.jsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import IconButton from "@mui/material/IconButton";
-import ArrowRight from "../../ArrowRight/index.jsx";
-import ArrowLeft from "../../ArrowLeft/index.jsx";
-import { useTheme } from "@mui/material/styles";
-import { useDispatch } from "react-redux";
-import { toggleSidebar } from "../../../../Features/UI/uiSlice.js";
-import PropTypes from "prop-types";
-
-const CollapseButton = ({ collapsed }) => {
- const theme = useTheme();
- const dispatch = useDispatch();
- const arrowIcon = collapsed ? (
-
- ) : (
-
- );
- return (
- {
- dispatch(toggleSidebar());
- }}
- >
- {arrowIcon}
-
- );
-};
-
-CollapseButton.propTypes = {
- collapsed: PropTypes.bool.isRequired,
-};
-export default CollapseButton;
diff --git a/client/src/Components/v1/Sidebar/components/logo.jsx b/client/src/Components/v1/Sidebar/components/logo.jsx
deleted file mode 100644
index a0c0ff84e..000000000
--- a/client/src/Components/v1/Sidebar/components/logo.jsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import Stack from "@mui/material/Stack";
-import Box from "@mui/material/Box";
-import Typography from "@mui/material/Typography";
-import { useTheme } from "@mui/material/styles";
-import { useNavigate } from "react-router";
-import { useTranslation } from "react-i18next";
-import PropTypes from "prop-types";
-
-const Logo = ({ collapsed }) => {
- const { t } = useTranslation();
- const theme = useTheme();
- const navigate = useNavigate();
-
- return (
- navigate("/")}
- sx={{ cursor: "pointer" }}
- >
-
- C
-
-
- {" "}
-
- {t("common.appName")}
-
-
-
- );
-};
-
-Logo.propTypes = {
- collapsed: PropTypes.bool,
-};
-
-export default Logo;
diff --git a/client/src/Components/v1/Sidebar/components/navItem.jsx b/client/src/Components/v1/Sidebar/components/navItem.jsx
deleted file mode 100644
index 170d39bee..000000000
--- a/client/src/Components/v1/Sidebar/components/navItem.jsx
+++ /dev/null
@@ -1,96 +0,0 @@
-import Tooltip from "@mui/material/Tooltip";
-import ListItemButton from "@mui/material/ListItemButton";
-import ListItemIcon from "@mui/material/ListItemIcon";
-import Box from "@mui/material/Box";
-import Typography from "@mui/material/Typography";
-import { useTheme } from "@emotion/react";
-import PropTypes from "prop-types";
-
-const NavItem = ({ item, collapsed, selected, onClick }) => {
- const theme = useTheme();
- const iconStroke = selected
- ? theme.palette.primary.contrastText
- : theme.palette.primary.contrastTextTertiary;
-
- const buttonBgColor = selected ? theme.palette.secondary.main : "transparent";
- const buttonBgHoverColor = selected
- ? theme.palette.secondary.main
- : theme.palette.tertiary.main;
- const fontWeight = selected ? 600 : 400;
- return (
-
-
-
- {item.icon}
-
-
-
- {item.name}
-
-
-
-
- );
-};
-
-NavItem.propTypes = {
- item: PropTypes.object,
- collapsed: PropTypes.bool,
- selected: PropTypes.bool,
- onClick: PropTypes.func,
-};
-export default NavItem;
diff --git a/client/src/Components/v1/Sidebar/index.jsx b/client/src/Components/v1/Sidebar/index.jsx
deleted file mode 100644
index 763a4123c..000000000
--- a/client/src/Components/v1/Sidebar/index.jsx
+++ /dev/null
@@ -1,152 +0,0 @@
-import Stack from "@mui/material/Stack";
-
-import List from "@mui/material/List";
-import Logo from "./components/logo.jsx";
-import CollapseButton from "./components/collapseButton.jsx";
-import Divider from "@mui/material/Divider";
-import NavItem from "./components/navItem.jsx";
-import AuthFooter from "./components/authFooter.jsx";
-
-import StarPrompt from "../StarPrompt/index.jsx";
-import Icon from "../Icon";
-
-// Utils
-import { useTheme } from "@mui/material/styles";
-import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router";
-import { useSidebar } from "@/Hooks/useSidebar.js";
-
-const URL_MAP = {
- support: "https://discord.com/invite/NAb6H3UTjK",
- discussions: "https://github.com/bluewave-labs/checkmate/discussions",
- docs: "https://bluewavelabs.gitbook.io/checkmate",
- changelog: "https://github.com/bluewave-labs/checkmate/releases",
-};
-
-const getMenu = (t) => [
- { name: t("menu.uptime"), path: "uptime", icon: },
- { name: t("menu.pagespeed"), path: "pagespeed", icon: },
- { name: t("menu.infrastructure"), path: "infrastructure", icon: },
- {
- name: t("menu.notifications"),
- path: "notifications",
- icon: ,
- },
- { name: t("menu.checks"), path: "checks", icon: },
- { name: t("menu.incidents"), path: "incidents", icon: },
- { name: t("menu.statusPages"), path: "status", icon: },
- { name: t("menu.maintenance"), path: "maintenance", icon: },
- { name: t("menu.logs"), path: "logs", icon: },
- {
- name: t("menu.settings"),
- icon: ,
- path: "settings",
- },
-];
-
-const getOtherMenuItems = (t) => [
- { name: t("menu.support"), path: "support", icon: },
- {
- name: t("menu.discussions"),
- path: "discussions",
- icon: ,
- },
- { name: t("menu.docs"), path: "docs", icon: },
- { name: t("menu.changelog"), path: "changelog", icon: },
-];
-
-const getAccountMenuItems = (t) => [
- { name: t("menu.profile"), path: "account/profile", icon: },
- { name: t("menu.password"), path: "account/password", icon: },
- { name: t("menu.team"), path: "account/team", icon: },
-];
-
-const Sidebar = () => {
- const theme = useTheme();
- const { t } = useTranslation();
- const navigate = useNavigate();
- const { collapsed, width, transition } = useSidebar();
-
- const menu = getMenu(t);
- const otherMenuItems = getOtherMenuItems(t);
- const accountMenuItems = getAccountMenuItems(t);
-
- return (
-
-
-
-
- {menu.map((item) => {
- const selected = location.pathname.startsWith(`/${item.path}`);
- return (
- navigate(`/${item.path}`)}
- />
- );
- })}
-
- {!collapsed && }
-
- {otherMenuItems.map((item) => {
- const selected = location.pathname.startsWith(`/${item.path}`);
-
- return (
- {
- const url = URL_MAP[item.path];
- if (url) {
- window.open(url, "_blank", "noreferrer");
- } else {
- navigate(`/${item.path}`);
- }
- }}
- />
- );
- })}
-
-
-
-
- );
-};
-
-export default Sidebar;
diff --git a/client/src/Components/v1/StarPrompt/index.jsx b/client/src/Components/v1/StarPrompt/index.jsx
deleted file mode 100644
index f1dd5e136..000000000
--- a/client/src/Components/v1/StarPrompt/index.jsx
+++ /dev/null
@@ -1,110 +0,0 @@
-import React from "react";
-import { Typography, IconButton, Stack, Box } from "@mui/material";
-import Icon from "../Icon";
-import { useTheme } from "@emotion/react";
-import { useSelector, useDispatch } from "react-redux";
-import { useTranslation } from "react-i18next";
-import { setStarPromptOpen } from "../../../Features/UI/uiSlice.js";
-
-const StarPrompt = ({ repoUrl = "https://github.com/bluewave-labs/checkmate" }) => {
- const theme = useTheme();
- const dispatch = useDispatch();
- const { t } = useTranslation();
- const isOpen = useSelector((state) => state.ui?.starPromptOpen ?? true);
- const mode = useSelector((state) => state.ui.mode);
-
- const handleClose = () => {
- dispatch(setStarPromptOpen(false));
- };
-
- const handleStarClick = () => {
- window.open(repoUrl, "_blank");
- };
-
- if (!isOpen) return null;
-
- return (
-
-
-
- {t("starPromptTitle")}
-
-
-
-
-
-
-
- {t("starPromptDescription")}
-
-
-
-
- );
-};
-
-export default StarPrompt;
diff --git a/client/src/Components/v2/sidebar/Authfooter.tsx b/client/src/Components/v2/sidebar/Authfooter.tsx
index 4b369cb67..62ea5610b 100644
--- a/client/src/Components/v2/sidebar/Authfooter.tsx
+++ b/client/src/Components/v2/sidebar/Authfooter.tsx
@@ -51,7 +51,7 @@ export const AuthFooter = ({ collapsed, accountMenuItems }: AuthFooterProps) =>
if (role.includes("superadmin"))
return t("components.sidebar.authFooter.roles.superAdmin");
if (role.includes("admin")) return t("components.sidebar.authFooter.roles.admin");
- if (role.includes("user")) return t("components.sidebar.authFooter.roles.teamMember");
+ if (role.includes("user")) return t("components.sidebar.authFooter.roles.user");
if (role.includes("demo")) return t("components.sidebar.authFooter.roles.demoUser");
return role;
};
diff --git a/client/src/locales/en.json b/client/src/locales/en.json
index b49ebaa43..86b220998 100644
--- a/client/src/locales/en.json
+++ b/client/src/locales/en.json
@@ -366,7 +366,7 @@
"roles": {
"superAdmin": "Super admin",
"admin": "Admin",
- "teamMember": "Team member",
+ "user": "User",
"demoUser": "Demo user"
}
}