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 { useAuth } from 'contexts/AuthProvider';
import { useDevice } from 'contexts/DeviceProvider';
import axiosInstance from 'utils/axiosInstance';
import eventBus from 'utils/eventBus';
import getDeviceConnection from 'utils/deviceHelper';
import LoadingButton from 'components/LoadingButton';
import SuccessfulActionModalBody from 'components/SuccessfulActionModalBody';
import WaitingForTraceBody from './WaitingForTraceBody';
import styles from './index.module.scss';
const TraceModal = ({ show, toggleModal }) => {
const { t } = useTranslation();
const { currentToken } = useAuth();
const { deviceSerialNumber } = 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(`/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);
setIsDeviceConnected(isConnected);
};
asyncGet();
}
}, [show]);
const getBody = () => {
if (waitingForTrace) {
return (
{t('trace.wait_for_file')}
{responseBody}