frontend/app/ScanTargets/MonitoringSetupCheck.tsx (92 lines of code) (raw):

import React, {useEffect, useState} from "react"; import axios from "axios"; import {MonitoringConfigurationResponse} from "../types"; import {CircularProgress, Grid, IconButton, makeStyles, Tooltip, Typography} from "@material-ui/core"; import {Build, CheckCircle, Refresh, WarningRounded} from "@material-ui/icons"; import clsx from "clsx"; interface MonitoringSetupCheckProps { scanTarget:string; } const useStyles = makeStyles((theme)=>({ inlineIcon: { height: "24px", width: "24px", verticalAlign: "bottom", marginRight: "0.4em" }, extraMargin: { marginLeft: "0.4em" }, warning: { color: theme.palette.warning.main }, ok: { color: theme.palette.success.main } })) const MonitoringSetupCheck:React.FC<MonitoringSetupCheckProps> = (props) => { const [loading, setLoading] = useState(true); const [needsAttention, setNeedsAttention] = useState(false); const [lastError, setLastError] = useState(""); const classes = useStyles(); const request = async (testOnly:boolean)=> { setLoading(true); try { const url = `/api/scanTarget/${encodeURIComponent(props.scanTarget)}/monitoringConfiguration`; const response = testOnly ? await axios.get<MonitoringConfigurationResponse>(url) : await axios.post<MonitoringConfigurationResponse>(url); setLastError(""); if(testOnly) { setLoading(false); setNeedsAttention(response.data.updatesRequired); } else { window.setTimeout(()=>request(true), 800); //if we updated the configuration, refresh after a short delay } } catch(err) { console.error(`Could not get monitoring configuration for scan target ${encodeURIComponent(props.scanTarget)}: `, err); setLoading(false); setLastError("Could not check monitoring configuration, consult the browser console logs for more information"); setNeedsAttention(false); } } const updateInfo = async ()=> request(true); const fixConfig = async ()=>request(false); useEffect(()=>{ if(props.scanTarget) updateInfo(); }, [props.scanTarget]); return ( <Grid container spacing={3} alignItems="baseline"> { loading ? <Grid item className={classes.extraMargin}><CircularProgress className={classes.inlineIcon}/></Grid> : undefined } { needsAttention && !lastError ? <> <Grid item className={classes.extraMargin}> <WarningRounded className={clsx(classes.warning, classes.inlineIcon)}/> <Typography style={{display: "inline"}}>Configuration is not valid</Typography> </Grid> <Grid item> <Tooltip title="Try to fix"> <IconButton onClick={fixConfig}><Build/></IconButton> </Tooltip> </Grid> </> : !lastError ? <> <Grid item className={classes.extraMargin}><CheckCircle className={clsx(classes.ok, classes.inlineIcon)}/></Grid> <Grid item><Typography>Configuration is valid</Typography></Grid> </> : undefined } { lastError ? <Grid item className={classes.extraMargin}><Typography>{lastError}</Typography></Grid> : undefined } { <Grid item> <Tooltip title="Check again"> <IconButton onClick={updateInfo}><Refresh/></IconButton> </Tooltip> </Grid> } </Grid> ) } export default MonitoringSetupCheck;