import { useState, useEffect } from "react"; import { TextField, InputAdornment } from "@mui/material"; import TaskAltIcon from "@mui/icons-material/TaskAlt"; import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline"; export interface IInputProps { label?: JSX.Element; lowerBound: number; changeValue: (val: number) => any; step: number; unit: string; upperBound: number; value: number | string | Array; correctValue?: number; showIcon?: boolean; effect?: (val: number) => any; radianEquivalent?: boolean; small?: boolean; mode?: string; update?: boolean; labelWidth?: string; } export const InputField = (props: IInputProps) => { const { changeValue, correctValue, effect, label, lowerBound, mode, radianEquivalent, showIcon, small, step, unit, upperBound, value, update, labelWidth, } = props; let epsilon: number = 0.01; let width = small ? "6em" : "7em"; let margin = small ? "0px" : "10px"; const [tempValue, setTempValue] = useState( mode != "Freeform" && !showIcon ? 0 : value ); const [tempRadianValue, setTempRadianValue] = useState( mode != "Freeform" && !showIcon ? 0 : (Number(value) * Math.PI) / 180 ); useEffect(() => { if (mode == "Freeform") { if (Math.abs(tempValue - Number(value)) > 1) { setTempValue(Number(value)); } } }, [value]); const externalUpdate = () => { changeValue(Number(value)); setTempValue(Number(value)); setTempRadianValue((Number(value) * Math.PI) / 180); }; useEffect(() => { externalUpdate(); }, [update]); const onChange = (event: React.ChangeEvent) => { let value = event.target.value == "" ? 0 : Number(event.target.value); if (value > upperBound) { value = upperBound; } else if (value < lowerBound) { value = lowerBound; } changeValue(value); setTempValue(event.target.value == "" ? event.target.value : value); setTempRadianValue((value * Math.PI) / 180); if (effect) { effect(value); } }; const onChangeRadianValue = (event: React.ChangeEvent) => { let value = event.target.value === "" ? 0 : Number(event.target.value); if (value > 2 * Math.PI) { value = 2 * Math.PI; } else if (value < 0) { value = 0; } changeValue((value * 180) / Math.PI); setTempValue((value * 180) / Math.PI); setTempRadianValue(value); if (effect) { effect((value * 180) / Math.PI); } }; return (
{label && (
{label}
)} {Math.abs(Number(value) - (correctValue ?? 0)) < epsilon && showIcon && } {Math.abs(Number(value) - (correctValue ?? 0)) >= epsilon && showIcon && } ), endAdornment: {unit}, }} /> {radianEquivalent && (

)} {radianEquivalent && ( rad, }} /> )}
); };