import { CButton, CModal, CModalHeader, CModalTitle, CModalBody, CModalFooter, CCol, CRow, CSelect, CSwitch, CForm, CInputRadio, CFormGroup, CLabel, } from '@coreui/react'; import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import PropTypes from 'prop-types'; import 'react-widgets/styles.css'; import axiosInstance from 'utils/axiosInstance'; import eventBus from 'utils/eventBus'; import { LoadingButton, useAuth, useDevice } from 'ucentral-libs'; import SuccessfulActionModalBody from 'components/SuccessfulActionModalBody'; import WaitingForTraceBody from './WaitingForTraceBody'; const TraceModal = ({ show, toggleModal }) => { const { t } = useTranslation(); const { currentToken, endpoints } = useAuth(); const { deviceSerialNumber, getDeviceConnection } = useDevice(); const [hadSuccess, setHadSuccess] = useState(false); const [hadFailure, setHadFailure] = useState(false); const [blockFields, setBlockFields] = useState(false); const [usingDuration, setUsingDuration] = useState(true); const [duration, setDuration] = useState(20); const [packets, setPackets] = useState(100); const [responseBody, setResponseBody] = useState(''); const [chosenInterface, setChosenInterface] = useState('up'); const [isDeviceConnected, setIsDeviceConnected] = useState(false); const [waitForTrace, setWaitForTrace] = useState(false); const [waitingForTrace, setWaitingForTrace] = useState(false); const [commandUuid, setCommandUuid] = useState(null); const toggleWaitForTrace = () => { setWaitForTrace(!waitForTrace); }; useEffect(() => { setWaitForTrace(false); setHadSuccess(false); setHadFailure(false); setResponseBody(''); setDuration(20); setPackets(100); setChosenInterface('up'); setWaitingForTrace(false); }, [show]); const doAction = () => { setBlockFields(true); setHadFailure(false); setHadSuccess(false); const parameters = { serialNumber: deviceSerialNumber, when: 0, network: chosenInterface, }; if (usingDuration) { parameters.duration = parseInt(duration, 10); } else { parameters.numberOfPackets = parseInt(packets, 10); } const headers = { Accept: 'application/json', Authorization: `Bearer ${currentToken}`, }; axiosInstance .post( `${endpoints.ucentralgw}/api/v1/device/${encodeURIComponent(deviceSerialNumber)}/trace`, parameters, { headers }, ) .then((response) => { setHadSuccess(true); if (waitForTrace) { setCommandUuid(response.data.UUID); setWaitingForTrace(true); } }) .catch(() => { setResponseBody(t('commands.error')); setHadFailure(true); }) .finally(() => { setBlockFields(false); setBlockFields(false); eventBus.dispatch('actionCompleted', { message: 'An action has been completed' }); }); }; useEffect(() => { if (deviceSerialNumber !== null && show) { const asyncGet = async () => { const isConnected = await getDeviceConnection( deviceSerialNumber, currentToken, endpoints.ucentralgw, ); setIsDeviceConnected(isConnected); }; asyncGet(); } }, [show]); const getBody = () => { if (waitingForTrace) { return ( ); } if (hadSuccess) { return ; } return (
{t('trace.directions')}
setUsingDuration(true)} > {t('common.duration')} setUsingDuration(false)} > {t('trace.packets')} {usingDuration ? 'Duration: ' : 'Packets: '} {usingDuration ? ( setDuration(e.target.value)} > ) : ( setPackets(e.target.value)} > )} {t('trace.choose_network')}: setChosenInterface('up')}> Up setChosenInterface('down')}> Down
{t('common.cancel')}
); }; return ( {t('trace.title')} {getBody()} ); }; TraceModal.propTypes = { show: PropTypes.bool.isRequired, toggleModal: PropTypes.func.isRequired, }; export default TraceModal;