// Components import { Box, Stack, Tooltip, Typography, Button, ButtonGroup } from "@mui/material"; import ConfigBox from "@/Components/v1/ConfigBox/index.jsx"; import Select from "@/Components/v1/Inputs/Select/index.jsx"; import TextInput from "@/Components/v1/Inputs/TextInput/index.jsx"; import Icon from "@/Components/v1/Icon"; import Breadcrumbs from "@/Components/v1/Breadcrumbs/index.jsx"; import PulseDot from "@/Components/v1/Animated/PulseDot.jsx"; import SkeletonLayout from "./skeleton.jsx"; import NotificationsConfig from "@/Components/v1/NotificationConfig/index.jsx"; import Dialog from "@/Components/v1/Dialog/index.jsx"; import { HttpAdornment } from "@/Components/v1/Inputs/TextInput/Adornments/index.jsx"; import Radio from "@/Components/v1/Inputs/Radio/index.jsx"; // Utils import { useState, useEffect } from "react"; import { useSelector } from "react-redux"; import { monitorValidation } from "../../../Validation/validation.js"; import { parseDomainName } from "../../../Utils/monitorUtils.js"; import { useTranslation } from "react-i18next"; import { useGetNotificationsByTeamId } from "../../../Hooks/useNotifications.js"; import { useTheme } from "@emotion/react"; import { createToast } from "../../../Utils/toastUtils.jsx"; import { useParams } from "react-router"; import { useMonitorUtils } from "../../../Hooks/useMonitorUtils.js"; import { useCreateMonitor, useFetchMonitorById, useDeleteMonitor, useUpdateMonitor, usePauseMonitor, } from "../../../Hooks/monitorHooks.js"; const PageSpeedSetup = () => { const { monitorId } = useParams(); const isCreate = typeof monitorId === "undefined"; const CRUMBS = [ { name: "pagespeed", path: "/pagespeed" }, ...(isCreate ? [{ name: "create", path: `/pagespeed/create` }] : [ { name: "details", path: `/pagespeed/${monitorId}` }, { name: "configure", path: `/pagespeed/configure/${monitorId}` }, ]), ]; // States const [monitor, setMonitor] = useState( isCreate ? { url: "", name: "", type: "pagespeed", notifications: [], interval: 180000, } : {} ); const [https, setHttps] = useState(true); const [errors, setErrors] = useState({}); const [isOpen, setIsOpen] = useState(false); const [updateTrigger, setUpdateTrigger] = useState(false); // Setup const { t } = useTranslation(); const theme = useTheme(); // Constants const MS_PER_MINUTE = 60000; const FREQUENCIES = [ { _id: 3, name: t("time.threeMinutes") }, { _id: 5, name: t("time.fiveMinutes") }, { _id: 10, name: t("time.tenMinutes") }, { _id: 20, name: t("time.twentyMinutes") }, { _id: 60, name: t("time.oneHour") }, { _id: 1440, name: t("time.oneDay") }, { _id: 10080, name: t("time.oneWeek") }, ]; const { user } = useSelector((state) => state.auth); const { statusColor, pagespeedStatusMsg, determineState } = useMonitorUtils(); const [notifications, notificationsAreLoading, notificationsError] = useGetNotificationsByTeamId(); // Hooks for API actions const [isLoading] = useFetchMonitorById({ monitorId, setMonitor, updateTrigger }); const [createMonitor, isCreating] = useCreateMonitor(); const [deleteMonitor, isDeleting] = useDeleteMonitor(); const [updateMonitor, isUpdating] = useUpdateMonitor(); const [pauseMonitor, isPausing] = usePauseMonitor(); // Handlers const onSubmit = async (event) => { event.preventDefault(); if (isCreate) { let form = { url: `http${https ? "s" : ""}://` + monitor.url, name: monitor.name === "" ? monitor.url : monitor.name, type: monitor.type, interval: monitor.interval, }; const { error } = monitorValidation.validate(form, { abortEarly: false }); if (error) { const newErrors = {}; error.details.forEach((err) => { newErrors[err.path[0]] = err.message; }); setErrors(newErrors); createToast({ body: t("checkFormError") }); return; } form = { ...form, description: form.name, notifications: monitor.notifications, }; await createMonitor({ monitor: form, redirect: "/pagespeed" }); } else { const monitorParams = { url: monitor.url, name: monitor.name === "" ? monitor.url : monitor.name, type: monitor.type, interval: monitor.interval, }; const { error } = monitorValidation.validate(monitorParams, { abortEarly: false }); if (error) { const newErrors = {}; error.details.forEach((err) => { newErrors[err.path[0]] = err.message; }); setErrors(newErrors); createToast({ body: t("checkFormError") }); return; } await updateMonitor({ monitor, redirect: "/pagespeed" }); } }; const handleChange = (event) => { let { value, name } = event.target; if (name === "interval") { value = value * MS_PER_MINUTE; } setMonitor({ ...monitor, [name]: value, }); const { error } = monitorValidation.validate( { [name]: value, type: monitor.type }, { abortEarly: false } ); setErrors((prev) => ({ ...prev, ...(error ? { [name]: error.details[0].message } : { [name]: undefined }), })); }; const handleBlur = (event) => { const { name, value } = event.target; if (name === "url" && monitor.name === "") { setMonitor((prev) => ({ ...prev, name: parseDomainName(value) })); } }; const triggerUpdate = () => { setUpdateTrigger(!updateTrigger); }; const handlePause = async () => { await pauseMonitor({ monitorId, triggerUpdate }); }; const handleRemove = async (event) => { event.preventDefault(); await deleteMonitor({ monitor: { id: monitorId }, redirect: "/pagespeed" }); }; const isBusy = isLoading || isCreating || isDeleting || isUpdating || isPausing; if (Object.keys(monitor).length === 0) { return ; } return ( {!isCreate ? monitor.name : t("createYour") + " "} {isCreate ? ( {t("pageSpeedMonitor")} ) : ( <> )} {!isCreate && ( {monitor.url?.replace(/^https?:\/\//, "") || "..."} {t("editing")} )} {!isCreate && ( )} {t("settingsGeneralSettings")} {t("pageSpeedConfigureSettingsDescription")} .Mui-disabled)": { backgroundColor: theme.palette.tertiary.main, }, }} > : undefined} placeholder="random.website.com" value={monitor.url || ""} onChange={handleChange} onBlur={isCreate ? handleBlur : undefined} error={!!errors["url"]} helperText={errors["url"]} disabled={!isCreate} /> {isCreate && ( {t("distributedUptimeCreateChecks")} {t("distributedUptimeCreateChecksDescription")} {errors["type"] ? ( {errors["type"]} ) : ( "" )} )} {t("notificationConfig.title")} {t("notificationConfig.description")} {t("distributedUptimeCreateAdvancedSettings")}