import { Button, IconButton, TextField } from "@material-ui/core"; import ECUDropDown from "../../Controls/ECUDropDown"; import React, { useEffect, useState } from "react"; import AddCircleIcon from "@material-ui/icons/AddCircle"; import DeleteIcon from "@material-ui/icons/Delete"; import { Redirect } from "react-router"; import { logger } from "../../../services/monitoring"; import { useStatusContext } from "../../Contexts/StatusContext"; import { useVehicleContext, VehicleProvider } from "../../Contexts/VehicleContext"; import { useUserContext } from "../../Contexts/UserContext"; import { useLocalStorage } from "../../useLocalStorage"; import useStyles from "../../useStyles"; import { DropDownList } from "../../Controls/DropDownList"; import modelsTrimsYears from '.././modelsTrimsYears.json'; const MainForm = () => { const { token: { idToken: { jwtToken: token }, }, } = useUserContext(); const classes = useStyles(); const [redirect, setRedirect] = useState(null); const { setMessage, setTitle, setSitePath } = useStatusContext(); const [carModel, setCarModel] = useLocalStorage("FLASHPACK_ADD_MODEL", "Ocean"); const [carTrim, setCarTrim] = useLocalStorage("FLASHPACK_ADD_TRIM", "Base"); const [carYear, setCarYear] = useLocalStorage("FLASHPACK_ADD_YEAR", 2024); const [trims, setTrims] = useLocalStorage("FLASHPACK_ADD_TRIMS", modelsTrimsYears.oceanTrims); const [years, setYears] = useLocalStorage("FLASHPACK_ADD_YEARS", modelsTrimsYears.oceanYears); const [flashpack, setFlashpack] = useState(); const [osVersion, setOSVersion] = useState(); const [mappingInputs, setMappingInputs] = useState([{ ecuName: "", ecuVersion: "" }]); const { addFlashpackVersion, getOSVersions, osVersions, busy, } = useVehicleContext(); useEffect(() => { setTitle(`Add Flashpack Version`); setSitePath([ { label: "Tools", link: "/tools/flashpacks", }, { label: "Flashpack Versions", link: "/tools/flashpacks", }, { label: `Add Flashpack Version`, }, ]); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { (async () => { try { if (!token) return; await getOSVersions(token); } catch (e) { setMessage(e.message); logger.warn(e.stack); } })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [token]); const onCarModelChange = (event) => { let newModel = event.target.value setCarModel(newModel) switch (newModel) { case "Ocean": setTrims(modelsTrimsYears.oceanTrims); setYears(modelsTrimsYears.oceanYears); break; default: break; } } const onCarTrimChange = (event) => { let newTrim = event.target.value setCarTrim(newTrim) } const onCarYearChange = (event) => { let newYear = event.target.value setCarYear(newYear) } const onFlashpackChange = (event) => { setFlashpack(event.target.value); } const onOSVersionChange = (event) => { setOSVersion(event.target.value); } const onSubmit = async (event) => { try { event.preventDefault(); const carFlashpackVersions = [] for (let i = 0; i < mappingInputs.length; i++) { mappingInputs[i] && mappingInputs[i].ecuName && mappingInputs[i].ecuVersion && carFlashpackVersions.push({ "car_ecu_name": mappingInputs[i].ecuName, "car_ecu_version": mappingInputs[i].ecuVersion, }) } const result = await addFlashpackVersion(carModel, carTrim, parseInt(carYear), flashpack, osVersion, carFlashpackVersions, token); if (!result || result.error) return; setMessage(`Added ${carYear} ${carModel} ${carTrim} ${flashpack}`); setRedirect(`/tools/flashpack/${carModel}/${carTrim}/${carYear}/${flashpack}`); } catch (e) { setMessage(e.message); logger.warn(e.stack); } }; if (redirect && redirect.length > 0) { return ; } // code for handling the dynamic input fields adapted from // https://blog.stackademic.com/how-to-dynamically-add-input-fields-on-button-click-in-reactjs-ddf8d8fe495b const handleAddMappingInput = () => { setMappingInputs([...mappingInputs, { ecuName: "", ecuVersion: "", }]); }; const handleChange = (event, index) => { let { name, value } = event.target; let onChangeValue = [...mappingInputs]; onChangeValue[index][name] = value; setMappingInputs(onChangeValue); }; const handleDeleteMappingInput = (index) => { const newArray = [...mappingInputs]; newArray.splice(index, 1); setMappingInputs(newArray); }; return (
{mappingInputs.map((item, index) => (
handleChange(event, index)} required /> handleChange(event, index)} type="text" /> {mappingInputs.length > 1 && ( handleDeleteMappingInput(index)} aria-label={`Delete`} size="small" color="primary" > )} {index === mappingInputs.length - 1 && ( handleAddMappingInput()} aria-label={`Add`} size="small" color="primary" > )}
))}
); }; const FlashpackAdd = () => ( ); export default FlashpackAdd;