import { Box, InputLabel, Radio, Table, TableBody, TableCell, TableHead, TableRow } from '@mui/material'; import React, { useState } from 'react'; import ToolContent from '@components/ToolContent'; import { ToolComponentProps } from '@tools/defineTool'; import ToolTextResult from '@components/result/ToolTextResult'; import TextFieldWithDesc from '@components/options/TextFieldWithDesc'; import { GetGroupsType, UpdateField } from '@components/options/ToolOptions'; import { InitialValuesType } from './types'; import nerdamer from 'nerdamer'; import 'nerdamer/Algebra'; import 'nerdamer/Solve'; import 'nerdamer/Calculus'; const ohmsLawCalc: { name: string; formula: string; variables: { name: string; title: string; unit: string; }[]; } = { name: "Ohm's Law Calculator", formula: 'V = I * R', variables: [ { name: 'V', title: 'Voltage', unit: 'V' }, { name: 'I', title: 'Current', unit: 'A' }, { name: 'R', title: 'Resistance', unit: 'Ω' } ] }; export default function makeTool(): React.JSXElementConstructor { const initialValues: InitialValuesType = { outputVariable: '', vars: {} }; return function GenericCalc({ title }: ToolComponentProps) { const [result, setResult] = useState(''); const [shortResult, setShortResult] = useState(''); const updateVarField = ( name: string, value: number, values: InitialValuesType, updateFieldFunc: UpdateField ) => { // Make copy const newVars = { ...values.vars }; newVars[name] = { value, unit: values.vars[name]?.unit || '' }; updateFieldFunc('vars', newVars); }; const handleSelectedTargetChange = ( varName: string, updateFieldFunc: UpdateField ) => { updateFieldFunc('outputVariable', varName); }; return ( } initialValues={initialValues} toolInfo={{ title: 'Common Equations', description: 'Common mathematical equations that can be used in calculations.' }} getGroups={({ values, updateField }) => [ { title: 'Input Variables', component: ( Variable Value Unit Solve For {ohmsLawCalc.variables.map((variable) => ( {variable.name} updateVarField( variable.name, parseFloat(val), values, updateField ) } type="number" /> {variable.unit} handleSelectedTargetChange( variable.name, updateField ) } /> ))}
) } ]} compute={(values) => { if (values.outputVariable === '') { setResult('Please select a solve for variable'); return; } let expr = nerdamer(ohmsLawCalc.formula); Object.keys(values.vars).forEach((key) => { if (key === values.outputVariable) return; expr = expr.sub(key, values.vars[key].value.toString()); }); let result: nerdamer.Expression = expr.solveFor( values.outputVariable ); // Sometimes the result is an array if (result.toDecimal === undefined) { result = (result as unknown as nerdamer.Expression[])[0]; } setResult(result.toString()); if (result) { if (values.vars[values.outputVariable] != undefined) { values.vars[values.outputVariable].value = parseFloat( result.toDecimal() ); } setShortResult(result.toDecimal()); } else { setShortResult(''); } }} /> ); }; }