Files
Checkmate/Client/src/Pages/PageSpeed/index.jsx
T

100 lines
3.1 KiB
React
Raw Normal View History

2024-09-04 22:51:00 -07:00
import { Box, Button, Grid, Stack } from "@mui/material";
2024-07-30 13:40:31 -04:00
import { useEffect } from "react";
2024-07-28 16:51:47 -04:00
import { useTheme } from "@emotion/react";
2024-07-30 13:40:31 -04:00
import { useDispatch, useSelector } from "react-redux";
2024-08-27 12:07:30 -07:00
import { getPageSpeedByTeamId } from "../../Features/PageSpeedMonitor/pageSpeedMonitorSlice";
2024-07-30 13:40:31 -04:00
import Fallback from "../../Components/Fallback";
import "./index.css";
import { useNavigate } from "react-router";
2024-08-20 10:55:54 -07:00
import PropTypes from "prop-types";
2024-08-30 13:15:22 -04:00
import Breadcrumbs from "../../Components/Breadcrumbs";
2024-08-30 13:20:36 -04:00
import Greeting from "../../Utils/greeting";
2024-09-04 22:51:00 -07:00
import SkeletonLayout from "./skeleton";
import Card from "./card";
2024-08-07 19:49:08 -04:00
const PageSpeed = ({ isAdmin }) => {
2024-07-28 16:51:47 -04:00
const theme = useTheme();
2024-07-30 13:40:31 -04:00
const dispatch = useDispatch();
const navigate = useNavigate();
2024-07-28 16:51:47 -04:00
2024-09-04 22:51:00 -07:00
const { authToken } = useSelector((state) => state.auth);
2024-09-05 13:25:19 -07:00
const { monitorsSummary, isLoading } = useSelector(
2024-08-07 17:52:46 -04:00
(state) => state.pageSpeedMonitors
);
2024-07-30 13:40:31 -04:00
useEffect(() => {
2024-08-27 12:07:30 -07:00
dispatch(getPageSpeedByTeamId(authToken));
2024-08-20 10:55:54 -07:00
}, [authToken, dispatch]);
2024-07-28 16:51:47 -04:00
// 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
2024-09-05 13:25:19 -07:00
let isActuallyLoading = isLoading && monitorsSummary?.monitors?.length === 0;
2024-07-28 16:51:47 -04:00
return (
2024-08-27 20:11:59 -04:00
<Box
className="page-speed"
sx={{
':has(> [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 ? (
2024-08-07 19:49:08 -04:00
<SkeletonLayout />
2024-09-05 13:25:19 -07:00
) : monitorsSummary?.monitors?.length !== 0 ? (
2024-08-30 13:15:22 -04:00
<Box
2024-08-28 14:42:38 -04:00
sx={{
2024-08-30 13:15:22 -04:00
"& p": {
2024-08-28 14:42:38 -04:00
color: theme.palette.text.secondary,
},
}}
>
2024-08-30 13:15:22 -04:00
<Box mb={theme.spacing(12)}>
<Breadcrumbs list={[{ name: `pagespeed`, path: "/pagespeed" }]} />
<Stack
direction="row"
justifyContent="space-between"
alignItems="center"
mt={theme.spacing(5)}
>
2024-08-30 13:20:36 -04:00
<Greeting type="pagespeed" />
2024-08-30 13:15:22 -04:00
<Button
2024-08-31 14:53:15 -04:00
variant="contained"
color="primary"
2024-08-30 13:15:22 -04:00
onClick={() => navigate("/pagespeed/create")}
2024-08-31 14:53:15 -04:00
>
Create new
</Button>
2024-08-30 13:15:22 -04:00
</Stack>
</Box>
2024-08-28 14:42:38 -04:00
<Grid container spacing={theme.spacing(12)}>
2024-09-05 13:25:19 -07:00
{monitorsSummary?.monitors?.map((monitor) => (
<Card data={monitor} key={monitor._id} />
2024-07-28 16:51:47 -04:00
))}
</Grid>
2024-08-30 13:15:22 -04:00
</Box>
2024-07-28 16:51:47 -04:00
) : (
<Fallback
2024-08-28 10:28:02 -04:00
title="pagespeed monitor"
2024-07-28 16:51:47 -04:00
checks={[
"Report on the user experience of a page",
"Help analyze webpage speed",
"Give suggestions on how the page can be improved",
]}
2024-08-02 18:08:36 -04:00
link="/pagespeed/create"
isAdmin={isAdmin}
2024-07-28 16:51:47 -04:00
/>
)}
</Box>
);
};
PageSpeed.propTypes = {
isAdmin: PropTypes.bool,
};
2024-07-28 16:51:47 -04:00
export default PageSpeed;