import { useState, useCallback, useContext, useEffect } from "react"; import { Button, Box, Stack, Typography } from "@mui/material"; import ConfigBox from "../../../Components/ConfigBox"; import { useTheme } from "@emotion/react"; import TabPanel from "@mui/lab/TabPanel"; import Card from "./Card"; import update from "immutability-helper"; import { StatusFormContext } from "../../../Pages/Status/CreateStatusContext"; import { useSelector } from "react-redux"; import { logger } from "../../../Utils/Logger" import { createToast } from "../../../Utils/toastUtils"; import { networkService } from "../../../main"; const ContentPanel = () => { const theme = useTheme(); const { form, setForm, errors, setErrors } = useContext(StatusFormContext); const [cards, setCards] = useState(form.monitors.length>0? form.monitors.map((m, idx)=>({id: idx, val: m})): []); const {user, authToken } = useSelector((state) => state.auth); const [monitors, setMonitors] = useState([]); useEffect(() => { const fetchMonitors = async () => { try { const response = await networkService.getMonitorsByTeamId({ authToken: authToken, teamId: user.teamId, limit: -1, types: ["http", "ping", "pagespeed", "hardware"], }); if(response.data.data.monitors.length==0){ setErrors({monitors: "Please config monitors to setup status page"}) } setMonitors(response.data.data.monitors); } catch (error) { createToast({ body: "Failed to fetch monitors data" }); logger.error("Failed to fetch monitors", error); } }; fetchMonitors(); }, [user, authToken]); const moveCard = useCallback( (dragIndex, hoverIndex) => { const dragCard = cards[dragIndex]; setCards( update(cards, { $splice: [ [dragIndex, 1], [hoverIndex, 0, dragCard], ], }) ); }, [cards] ); const handleCardChange = (event, val) => { event.preventDefault(); const { id } = event.target; let idx = cards.findIndex((a) => { let found = false; let optionIdx = id.indexOf("-option"); if (optionIdx !== -1) found = a.id == id.substr(0, optionIdx); else found = a.id == id; return found; }); let newCards; if (idx >= 0) { let x = JSON.parse(JSON.stringify(cards[idx])); x.val = val; newCards = update(cards, { $splice: [[idx, 1, x]] }); setCards(newCards); } else { newCards = update(cards, { $push: [{ id: id, val: val }] }); setCards(newCards); } setForm({ ...form, monitors: newCards.map(c=>c.val) }); }; const handleAddNew = () => { if (cards.length === monitors.length) return; const newCards = [...cards, { id: "" + Math.random() }]; setCards(newCards); }; const removeCard = (id) => { const newCards = cards.filter((c) => c?.id != id); setCards(newCards); setForm({ ...form, monitors: newCards.filter((c) => c.val !== undefined).map((c) => c.val), }); }; return ( Status page servers You can add any number of servers that you monitor to your status page. You can also reorder them for the best viewing experience. {" "} Servers list{" "} {cards.length > 0 && ( {cards.map((card, idx) => { return ( ); })} )} {errors["monitors"] && ( {errors["monitors"]} )} Features Show more details on the status page {/* */} ); }; export default ContentPanel;