import { CAlert, CButton, CModal, CModalHeader, CModalTitle, CModalBody, CModalFooter, CSpinner, CCol, CRow, CForm, CTextarea, CInvalidFeedback, CInputFile, CPopover, } from '@coreui/react'; import CIcon from '@coreui/icons-react'; import { cilX } from '@coreui/icons'; import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import PropTypes from 'prop-types'; import 'react-widgets/styles.css'; import { useAuth, useDevice, useToast } from 'ucentral-libs'; import { checkIfJson } from 'utils/helper'; import axiosInstance from 'utils/axiosInstance'; import eventBus from 'utils/eventBus'; import SuccessfulActionModalBody from 'components/SuccessfulActionModalBody'; const ConfigureModal = ({ show, toggleModal }) => { const { t } = useTranslation(); const { currentToken, endpoints } = useAuth(); const { addToast } = useToast(); const { deviceSerialNumber } = useDevice(); const [hadSuccess, setHadSuccess] = useState(false); const [hadFailure, setHadFailure] = useState(false); const [doingNow, setDoingNow] = useState(false); const [waiting, setWaiting] = useState(false); const [newConfig, setNewConfig] = useState(''); const [responseBody, setResponseBody] = useState(''); const [checkingIfSure, setCheckingIfSure] = useState(false); const [errorJson, setErrorJson] = useState(false); const [inputKey, setInputKey] = useState(0); let fileReader; const confirmingIfSure = () => { if (checkIfJson(newConfig)) { setCheckingIfSure(true); } else { setErrorJson(true); } }; useEffect(() => { setHadSuccess(false); setHadFailure(false); setWaiting(false); setResponseBody(''); setCheckingIfSure(false); setDoingNow(false); setNewConfig(''); setErrorJson(false); setInputKey(0); }, [show]); useEffect(() => { setErrorJson(false); }, [newConfig]); const doAction = (isNow) => { setDoingNow(isNow); setHadFailure(false); setHadSuccess(false); setWaiting(true); const parameters = { serialNumber: deviceSerialNumber, when: 0, UUID: 1, configuration: JSON.parse(newConfig), }; const headers = { Accept: 'application/json', Authorization: `Bearer ${currentToken}`, }; axiosInstance .post( `${endpoints.owgw}/api/v1/device/${encodeURIComponent(deviceSerialNumber)}/configure`, parameters, { headers }, ) .then(() => { addToast({ title: t('common.success'), body: t('commands.command_success'), color: 'success', autohide: true, }); toggleModal(); }) .catch((e) => { setResponseBody('Error while submitting command!'); if (e.response?.data?.ErrorDescription !== undefined) { const split = e.response?.data?.ErrorDescription.split(':'); if (split !== undefined && split.length >= 2) { addToast({ title: t('common.error'), body: split[1], color: 'danger', autohide: true, }); } } setHadFailure(true); }) .finally(() => { setDoingNow(false); setCheckingIfSure(false); setWaiting(false); eventBus.dispatch('actionCompleted', { message: 'An action has been completed' }); }); }; const handleJsonRead = () => { setErrorJson(false); const content = fileReader.result; if (checkIfJson(content)) { setNewConfig(content); } else { setErrorJson(true); } }; const handleJsonFile = (file) => { fileReader = new FileReader(); fileReader.onloadend = handleJsonRead; fileReader.readAsText(file); }; const resetText = () => { setInputKey(inputKey + 1); setNewConfig(''); }; return ( {t('configure.title')}
{hadSuccess ? ( ) : (
{t('configure.enter_new')}
{t('common.clear')}
setNewConfig(event.target.value)} invalid={errorJson} /> {t('configure.valid_json')} {t('configure.choose_file')} handleJsonFile(e.target.files[0])} key={inputKey} />
{t('common.cancel')}
)}
); }; ConfigureModal.propTypes = { show: PropTypes.bool.isRequired, toggleModal: PropTypes.func.isRequired, }; export default ConfigureModal;