| | import React, { useState, useRef,useEffect } from 'react'; |
| | import { Toast } from 'primereact/toast'; |
| | import SpinnerIcon from './SpinnerIcon'; |
| | import SpinnerIcon2 from './SpinnerIcon2'; |
| | import styled from 'styled-components'; |
| | import axios from 'axios'; |
| | import { ProgressBar } from "primereact/progressbar"; |
| | |
| |
|
| | export default function ProgressToast({baseUrl}) { |
| | const isFirstRender = useRef(true); |
| | const [visible, setVisible] = useState(false); |
| | let [auditProgress, setAuditProgress] = useState(0); |
| | let [running, setRunning] = useState(false); |
| | let [model, setModel] = useState(null); |
| | const toastBC = useRef(null); |
| |
|
| | useEffect(() => { |
| | let interval; |
| |
|
| | interval = setInterval(async () => { |
| | try { |
| | const response = await axios.get(`${baseUrl}/status`); |
| | |
| | setAuditProgress(Math.round(response.data["%_completed"]*100)/100) ; |
| | setModel(response.data["model"]); |
| | setRunning(response.data["running"]); |
| | |
| | } catch (error) { |
| | console.error("Error fetching audit progress:", error); |
| | } |
| | }, 3000); |
| | |
| |
|
| | |
| | return () => { |
| | if (interval) clearInterval(interval); |
| | }; |
| | }, []); |
| |
|
| | useEffect(() => { |
| | if(isFirstRender.current) { |
| | isFirstRender.current = false; |
| | return; |
| | } |
| | if(visible) confirm(); |
| | }, [running]); |
| |
|
| | const clear = () => { |
| | toastBC.current.clear(); |
| | setVisible(false); |
| | }; |
| |
|
| | const confirm = () => { |
| | if(1) { |
| | setVisible(true); |
| | toastBC.current.clear(); |
| | toastBC.current.show({ |
| | severity: 'info', |
| | summary: 'No running audit in progress', |
| | sticky: false, |
| | content: (props) => ( |
| | <div key={auditProgress} className="flex flex-column align-items-left" style={{ flex: '1' }}> |
| | <div className="flex align-items-center gap-2"> |
| | <span className="font-bold text-900">Audit Progress : </span> |
| | </div> |
| | { |
| | running ? (<> |
| | <div className="font-medium text-lg my-2 text-900"></div> |
| | <ProgressBar color='#3b82f6' value={auditProgress} style={{ height: "15px", fontSize:"13px", borderRadius:"1000px" }}/> |
| | </>) : ( |
| | <div className="font-medium text-lg my-2 text-900">{props.message.summary}</div> |
| | ) |
| | } |
| | |
| | </div> |
| | ) |
| | }); |
| | } |
| | }; |
| |
|
| | return ( |
| | <div className="flex justify-content-end"> |
| | <Toast ref={toastBC} position="top-right" onRemove={clear} /> |
| | <Btn onClick={confirm} label="Confirm" type='button'> |
| | { running ? <SpinnerIcon/> : <SpinnerIcon2/> } |
| | </Btn> |
| | </div> |
| | ) |
| | } |
| |
|
| | const Btn = styled.button` |
| | background-color: #3083ff; /* Green */ |
| | border: none; |
| | padding: 4px 4px; |
| | text-align: center; |
| | position: fixed; |
| | bottom: 16px; |
| | right: 6px; |
| | z-index: 5; |
| | margin: 4px 4px; |
| | cursor: pointer; |
| | border-radius: 100px; |
| | ` |