import { useState, useEffect, forwardRef, useImperativeHandle } from "react"; import { Checkbox, FormControl, FormControlLabel, FormGroup, FormLabel, Radio, RadioGroup, TextField, } from '@material-ui/core'; import SearchSelect from "../../SearchSelect/SearchSelect"; import { useStatusContext } from "../../Contexts/StatusContext"; import { useUserContext } from "../../Contexts/UserContext"; import fleetsAPI from "../../../services/fleetsAPI"; import useStyles from "../../useStyles"; const DEFAULT_LOG_LEVEL = "info"; const DEFAULT_CANBUS_ENABLED = false; const DEFAULT_DATA_LOGGER_ENABLED = false; const DEFAULT_MAX_MEM_BUFFER_SIZE = 0; const DEFAULT_MAX_DISK_BUFFER_SIZE = 0; const DEFAULT_IDPS_ENABLED = true; export default forwardRef(({ ids = [], idCSV = "", fleet, }, ref) => { const [fromFleet, setFromFleet] = useState(fleet); const [toFleet, setToFleet] = useState(); const classnames = useStyles(); const { setMessage } = useStatusContext(); const { token: { idToken: { jwtToken: token } } } = useUserContext(); const [selectedLogLevel, setSelectedLogLevel] = useState(DEFAULT_LOG_LEVEL); const [canbusEnabled, setCANBusEnabled] = useState(DEFAULT_CANBUS_ENABLED); const [idpsEnabled, setIDPSEnabled] = useState(DEFAULT_IDPS_ENABLED); const [dataLoggerEnabled, setDataLoggerEnabled] = useState(DEFAULT_DATA_LOGGER_ENABLED); const [maxMemBufferSize, setMaxMemBufferSize] = useState(DEFAULT_MAX_MEM_BUFFER_SIZE); const [maxDiskBufferSize, setMaxDiskBufferSize] = useState(DEFAULT_MAX_DISK_BUFFER_SIZE); const logLevel = [ ["trace", "Trace"], ["debug", "Debug"], ["info", "Info"], ["warning", "Warning"], ["error", "Error"], ["critical", "Critical"], ]; useImperativeHandle(ref, () => ({ async submit() { const errorTracking = [false, false]; if (toFleet) { const payload = { vins: ids, log_level: selectedLogLevel, canbus: { enabled: canbusEnabled, data_logger_enabled: canbusEnabled ? dataLoggerEnabled : false, max_mem_buffer_size: parseInt(maxMemBufferSize), max_disk_buffer_size: parseInt(maxDiskBufferSize), }, idps_enabled: idpsEnabled, }; await fleetsAPI .addFleetVehicles(toFleet, payload, token) .then((response) => { if (response.error) { errorTracking[0] = true; setMessage(`${response.error}: ${response.message}`); } if (response.vins) { setMessage(`Added ${response.vins.length} vehicles to ${toFleet}.`); return; } setMessage(`Something unexpected happened while attempting to add vehicles to fleet.`); }) .catch((error) => { setMessage(JSON.stringify(error)); return Promise.reject("Could not add vehicles to fleet."); }); } if (fromFleet) { await fleetsAPI .deleteFleetVehicles(fromFleet, ids, token) .then((response) => { if (response.error) { errorTracking[1] = true; setMessage(`${response.error}: ${response.message}`); } if (response.message === "Deleted") { setMessage(`Removed ${ids.length} vehicles from ${fromFleet}.`); return; } }) .catch((error) => { setMessage(JSON.stringify(error)); return Promise.reject("Could not remove vehicles from fleet."); }); } return { fromFleet, fromVehicles: errorTracking[1] ? [] : ids, toFleet, toVehicles: errorTracking[0] ? [] : ids, }; }, })); async function searchFleets(search) { return fleetsAPI .getFleets({ search, limit: 10, offset: 0, order: `id desc`, }, token) .then(response => response.data.map(fleet => fleet.name)) .catch(() => []); } const onLogLevelChange = (event) => { setSelectedLogLevel(event.target.value); } const onCANBusChange = (event) => { setCANBusEnabled(event.target.checked); } const onIDPSChange = (event) => { setIDPSEnabled(event.target.checked); } const onDataLoggerChange = (event) => { setDataLoggerEnabled(event.target.checked); } const onMaxMemBufferSizeChange = (event) => { setMaxMemBufferSize(event.target.value); } const onMaxDiskBufferSizeChange = (event) => { setMaxDiskBufferSize(event.target.value); } useEffect(() => { if (!toFleet) { setSelectedLogLevel(DEFAULT_LOG_LEVEL); setCANBusEnabled(DEFAULT_CANBUS_ENABLED); setIDPSEnabled(DEFAULT_IDPS_ENABLED); setDataLoggerEnabled(DEFAULT_DATA_LOGGER_ENABLED); setMaxMemBufferSize(DEFAULT_MAX_MEM_BUFFER_SIZE); setMaxDiskBufferSize(DEFAULT_MAX_DISK_BUFFER_SIZE); } }, [ toFleet, setSelectedLogLevel, setCANBusEnabled, setIDPSEnabled, setDataLoggerEnabled, setMaxMemBufferSize, setMaxDiskBufferSize ]); useEffect(() => { if (!canbusEnabled) { setDataLoggerEnabled(DEFAULT_DATA_LOGGER_ENABLED); setMaxMemBufferSize(DEFAULT_MAX_MEM_BUFFER_SIZE); setMaxDiskBufferSize(DEFAULT_MAX_DISK_BUFFER_SIZE); setIDPSEnabled(DEFAULT_IDPS_ENABLED) } }, [ canbusEnabled, setDataLoggerEnabled, setIDPSEnabled, setMaxMemBufferSize, setMaxDiskBufferSize, ]); useEffect(() => { if (!dataLoggerEnabled) { setMaxDiskBufferSize(DEFAULT_MAX_DISK_BUFFER_SIZE); } }, [ dataLoggerEnabled, setMaxDiskBufferSize, ]); return (

This operation will affect fleet membership for the following VINs: {idCSV}.

VINs will be removed from the "From Fleet" and added to the "To Fleet". If you would like to only add or only remove the other field can be left blank.

Log Level {logLevel.map(([value, label]) => ( } label={label} disabled={!toFleet} /> ))} } label="CAN Bus Enabled" /> } label="IDPS Enabled" /> } label="Data Logger Enabled" />
); });