import { Box, Grid, Skeleton, Stack, Typography } from "@mui/material"; import { useEffect } from "react"; import { useTheme } from "@emotion/react"; import { formatDate, formatDurationRounded } from "../../Utils/timeUtils"; import { StatusLabel } from "../../Components/Label"; import { useDispatch, useSelector } from "react-redux"; import { getPageSpeedByUserId } from "../../Features/PageSpeedMonitor/pageSpeedMonitorSlice"; import PageSpeedIcon from "../../assets/icons/page-speed.svg?react"; import Fallback from "../../Components/Fallback"; import "./index.css"; import Button from "../../Components/Button"; import { useNavigate } from "react-router"; import { getLastChecked } from "../../Utils/monitorUtils"; import PropTypes from "prop-types"; const Card = ({ data }) => { const theme = useTheme(); const navigate = useNavigate(); return ( .MuiStack-root": { backgroundColor: "var(--primary-bg-accent)", }, }} > navigate(`/pagespeed/${data._id}`)} sx={{ cursor: "pointer" }} > {data.name} {data.url.replace(/^https?:\/\//, "")} Last checked:{" "} {formatDate(getLastChecked(data.checks, false))}{" "} ({formatDurationRounded(getLastChecked(data.checks))} ago) ); }; Card.propTypes = { data: PropTypes.object.isRequired, }; /** * Renders a skeleton layout. * * @returns {JSX.Element} */ const SkeletonLayout = () => { const theme = useTheme(); return ( ); }; const PageSpeed = () => { const theme = useTheme(); const dispatch = useDispatch(); const navigate = useNavigate(); const { authToken } = useSelector((state) => state.auth); const { monitors, isLoading } = useSelector( (state) => state.pageSpeedMonitors ); useEffect(() => { dispatch(getPageSpeedByUserId(authToken)); }, [authToken, dispatch]); // will show skeletons only on initial load // since monitor state is being added to redux persist, there's no reason to display skeletons on every render let isActuallyLoading = isLoading && monitors.length === 0; return ( [class*="fallback__"])': { position: "relative", border: 1, borderColor: theme.palette.border.light, borderRadius: theme.shape.borderRadius, borderStyle: "dashed", backgroundColor: theme.palette.background.main, overflow: "hidden", }, }} > {isActuallyLoading ? ( ) : monitors?.length !== 0 ? ( All page speed monitors Click on one of the monitors to get more site speed information.