* Add basic Popover functionality * Fix up light mode of basic bar * Add support for 2D and 3D mode styling * Turn toolbar buttons back on * Remove ActionButton until after tool logic refactor * Add transitions * Add initial modeling machine This is not a full description of how the modelingMachine should work, but begins to replicate all of the features of our useStore in XState instead of zustand. * Add fillet tool flow * Refactor: break out engine manager setup into hook Preparing for making a wrapper component around the App that will manage the engine manager at the same level as the modelingMachine. * Create modeling provider, move engine management to it * Refactor: move other engine-related useEffect into hook * Add TS schema, selection actions to modelingMachine * Add barebones modeling machine to app Only implementing adding to code-based selections in the text editor so far * Update moved useEffect hook after merge * give myself reminder TODO * fix engineCommandManager waitForReady Promise * enable devtools * make utility class for handling default planes * progresson startNewSketch and EditSketch * add provider to tests * too large of a commit put all of the lang state into another singleton, but did lots of work on xstate too * fix edit sketch ast issue * re-execute on sketch exit * prettierignore xstate typegen file * add move tool button back in * handle mouse commands with xState states * fix move * remove old imports * big useStore delete * fix some destructuring bugs * start of constraint actions * add horizontal/vertical distance constraints * fix more destructuring errors * fix * add angle constaints * add align vertically/horizontally constraints * add length and equal length constraints * rename modal states to be more cmd bar friendly * add doesPipeHave query * add another query * add extrude states * state machine clean up * xstate layout tweak * make xstate types happy * Revamp cursor logic and place curors after ast mod * Xstate merge (#796) * turning back on all planes (#720) * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix more tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> fix stdlib Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> compile Signed-off-by: Jess Frazelle <github@jessfraz.com> update sample code Signed-off-by: Jess Frazelle <github@jessfraz.com> re-enable the planes Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fix all tests Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> boilerplate Signed-off-by: Jess Frazelle <github@jessfraz.com> Cut release v0.9.2 (#714) rust make default planes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> use the planes from engine Signed-off-by: Jess Frazelle <github@jessfraz.com> fixups Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> negative args Signed-off-by: Jess Frazelle <github@jessfraz.com> diable camera Signed-off-by: Jess Frazelle <github@jessfraz.com> hide planes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updatress Signed-off-by: Jess Frazelle <github@jessfraz.com> fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> Update src/hooks/useAppMode.ts Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch> Update src/hooks/useAppMode.ts Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch> cleanups Signed-off-by: Jess Frazelle <github@jessfraz.com> Bump kittycad from 0.2.26 to 0.2.27 in /src-tauri (#726) Bumps [kittycad](https://github.com/KittyCAD/kittycad.rs) from 0.2.26 to 0.2.27. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](https://github.com/KittyCAD/kittycad.rs/compare/v0.2.26...v0.2.27) --- updated-dependencies: - dependency-name: kittycad dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump tauri-plugin-fs-extra from `b04bde3` to `6c7a4c0` in /src-tauri (#725) Bumps [tauri-plugin-fs-extra](https://github.com/tauri-apps/plugins-workspace) from `b04bde3` to `6c7a4c0`. - [Release notes](https://github.com/tauri-apps/plugins-workspace/releases) - [Commits](b04bde3461...6c7a4c0984
) --- updated-dependencies: - dependency-name: tauri-plugin-fs-extra dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump toml from 0.8.0 to 0.8.1 in /src-tauri (#724) Bumps [toml](https://github.com/toml-rs/toml) from 0.8.0 to 0.8.1. - [Commits](https://github.com/toml-rs/toml/compare/toml-v0.8.0...toml-v0.8.1) --- updated-dependencies: - dependency-name: toml dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump openapitor from `61a1605` to `d3e98c4` in /src/wasm-lib (#723) Bumps [openapitor](https://github.com/KittyCAD/kittycad.rs) from `61a1605` to `d3e98c4`. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](61a16059b3...d3e98c4ec0
) --- updated-dependencies: - dependency-name: openapitor dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump kittycad from 0.2.26 to 0.2.27 in /src/wasm-lib (#722) Bumps [kittycad](https://github.com/KittyCAD/kittycad.rs) from 0.2.26 to 0.2.27. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](https://github.com/KittyCAD/kittycad.rs/compare/v0.2.26...v0.2.27) --- updated-dependencies: - dependency-name: kittycad dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump thiserror from 1.0.48 to 1.0.49 in /src/wasm-lib (#721) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.48 to 1.0.49. - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](https://github.com/dtolnay/thiserror/compare/1.0.48...1.0.49) --- updated-dependencies: - dependency-name: thiserror dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump expectorate from 1.0.7 to 1.1.0 in /src/wasm-lib (#712) Bumps [expectorate](https://github.com/oxidecomputer/expectorate) from 1.0.7 to 1.1.0. - [Release notes](https://github.com/oxidecomputer/expectorate/releases) - [Commits](https://github.com/oxidecomputer/expectorate/compare/v1.0.7...v1.1.0) --- updated-dependencies: - dependency-name: expectorate dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump clap from 4.4.4 to 4.4.5 in /src/wasm-lib (#711) Bumps [clap](https://github.com/clap-rs/clap) from 4.4.4 to 4.4.5. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v4.4.4...v4.4.5) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> refactor cleanup Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> type improvements * use new sketchmode no camera Signed-off-by: Jess Frazelle <github@jessfraz.com> * js working better Signed-off-by: Jess Frazelle <github@jessfraz.com> * start of negative planes Signed-off-by: Jess Frazelle <github@jessfraz.com> * tests and neg Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * images Signed-off-by: Jess Frazelle <github@jessfraz.com> * norma;s Signed-off-by: Jess Frazelle <github@jessfraz.com> * better initial load of planes Signed-off-by: Jess Frazelle <github@jessfraz.com> * ts Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix tsc Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix edit sketch Signed-off-by: Jess Frazelle <github@jessfraz.com> * add regression test for 2d solid issue Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * show planes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix clippy Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> * canecel in progress Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix ci as well Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> * stopping point Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * refactor Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * it works Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * Hide planes (#797) * hide planes in one go Signed-off-by: Jess Frazelle <github@jessfraz.com> * update hide; Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> * make tsc happy * Make "Replay Onboarding" button available on home settings page (#804) * Fix unrelated bug, settings button in the home sidebar doesn't go to the home settings after my previous fixes to routes * Turn on "Replay Onboarding" button in home settings * Use ONBOARDING_PROJECT_NAME in both places * Fix formatting * Cut release v0.10.0 (#803) Co-authored-by: Frank Noirot <frank@kittycad.io> * Bump kittycad from 0.2.28 to 0.2.31 in /src-tauri (#798) Bumps [kittycad](https://github.com/KittyCAD/kittycad.rs) from 0.2.28 to 0.2.31. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](https://github.com/KittyCAD/kittycad.rs/compare/v0.2.28...v0.2.31) --- updated-dependencies: - dependency-name: kittycad dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump openapitor from `fa0345c` to `c122a9b` in /src/wasm-lib (#800) Bumps [openapitor](https://github.com/KittyCAD/kittycad.rs) from `fa0345c` to `c122a9b`. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](fa0345c514...c122a9b1d6
) --- updated-dependencies: - dependency-name: openapitor dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump syn from 2.0.37 to 2.0.38 in /src/wasm-lib (#801) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.37 to 2.0.38. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.37...2.0.38) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump winnow from 0.5.15 to 0.5.16 in /src/wasm-lib (#799) Bumps [winnow](https://github.com/winnow-rs/winnow) from 0.5.15 to 0.5.16. - [Changelog](https://github.com/winnow-rs/winnow/blob/main/CHANGELOG.md) - [Commits](https://github.com/winnow-rs/winnow/compare/v0.5.15...v0.5.16) --- updated-dependencies: - dependency-name: winnow dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump tauri-plugin-fs-extra from `fa32d1a` to `9f27e6e` in /src-tauri (#802) Bumps [tauri-plugin-fs-extra](https://github.com/tauri-apps/plugins-workspace) from `fa32d1a` to `9f27e6e`. - [Release notes](https://github.com/tauri-apps/plugins-workspace/releases) - [Commits](fa32d1afa9...9f27e6e441
) --- updated-dependencies: - dependency-name: tauri-plugin-fs-extra dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * better plane selection Signed-off-by: Jess Frazelle <github@jessfraz.com> * use the sketch plane id Signed-off-by: Jess Frazelle <github@jessfraz.com> * add todo w bug Signed-off-by: Jess Frazelle <github@jessfraz.com> * Improve Prop Typings for Modals. Remove instances of `any`. (#792) * Update typings for modals. Remove instances of `any` * Fix generic type for creating modals * cleanup other stuffs Signed-off-by: Jess Frazelle <github@jessfraz.com> * make plane id available when selecting default plane * few clean up things * change enter sketch action order to make sure plane id is available to 'enter edit mode' * Revert "Improve Prop Typings for Modals. Remove instances of `any`. (… (#813) Revert "Improve Prop Typings for Modals. Remove instances of `any`. (#792)" This reverts commit629f326f4c
. * ffmpeg instructions (#814) * fix some tsc stuff * small tweak --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Kurt Hutten Irev-Dev <k.hutten@protonmail.ch> Co-authored-by: Frank Noirot <frank@kittycad.io> Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jason Rametta <rametta@outlook.com> * clean up * fix test and tsc * remove one more thing from useStore * tweak state digrame layout * fmt --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Frank Johnson <frankjohnson1993@gmail.com> Co-authored-by: Frank Noirot <frank@kittycad.io> Co-authored-by: Jess Frazelle <jessfraz@users.noreply.github.com> Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jason Rametta <rametta@outlook.com>
282 lines
8.2 KiB
TypeScript
282 lines
8.2 KiB
TypeScript
import { useEffect, useState, useRef } from 'react'
|
|
import { parse, BinaryPart, Value, executor } from '../lang/wasm'
|
|
import {
|
|
createIdentifier,
|
|
createLiteral,
|
|
createUnaryExpression,
|
|
findUniqueName,
|
|
} from '../lang/modifyAst'
|
|
import { findAllPreviousVariables, PrevVariable } from '../lang/queryAst'
|
|
import { engineCommandManager } from '../lang/std/engineConnection'
|
|
import { kclManager, useKclContext } from 'lang/KclSinglton'
|
|
import { useModelingContext } from 'hooks/useModelingContext'
|
|
|
|
export const AvailableVars = ({
|
|
onVarClick,
|
|
prevVariables,
|
|
}: {
|
|
onVarClick: (a: string) => void
|
|
prevVariables: PrevVariable<any>[]
|
|
}) => {
|
|
return (
|
|
<ul className="flex flex-col">
|
|
{prevVariables.length &&
|
|
prevVariables.map(({ key, value }) => (
|
|
<li key={key}>
|
|
<button
|
|
className="flex w-full justify-between items-center rounded-md hover:bg-gray-100 max-w-xs"
|
|
onClick={() => onVarClick(key)}
|
|
>
|
|
<span className="font-[monospace] text-gray-800">{key}</span>{' '}
|
|
<span className="font-[monospace] text-gray-600 w-24 text-start font-bold">
|
|
{value}
|
|
</span>
|
|
</button>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
)
|
|
}
|
|
|
|
export const addToInputHelper =
|
|
(
|
|
inputRef: React.RefObject<HTMLInputElement>,
|
|
setValue: (a: string) => void
|
|
) =>
|
|
(varName: string) => {
|
|
const selectionStart = inputRef.current?.selectionStart
|
|
let selectionEnd = inputRef.current?.selectionEnd
|
|
let newValue = ''
|
|
if (
|
|
typeof selectionStart === 'number' &&
|
|
typeof selectionEnd === 'number'
|
|
) {
|
|
newValue = stringSplice(
|
|
inputRef.current?.value || '',
|
|
selectionStart,
|
|
selectionEnd,
|
|
varName
|
|
)
|
|
selectionEnd = selectionStart + varName.length
|
|
} else {
|
|
newValue = inputRef.current?.value + varName
|
|
}
|
|
setValue(newValue)
|
|
inputRef.current?.focus()
|
|
setTimeout(() => {
|
|
// run in the next render cycle
|
|
const _selectionEnd =
|
|
typeof selectionEnd === 'number' ? selectionEnd : newValue.length
|
|
inputRef.current?.setSelectionRange(_selectionEnd, _selectionEnd)
|
|
})
|
|
}
|
|
|
|
function stringSplice(str: string, index: number, count: number, add: string) {
|
|
return str.slice(0, index) + (add || '') + str.slice(index + count)
|
|
}
|
|
|
|
// what a terriable name
|
|
export function useCalc({
|
|
value,
|
|
initialVariableName: valueName = '',
|
|
}: {
|
|
value: string
|
|
initialVariableName?: string
|
|
}): {
|
|
inputRef: React.RefObject<HTMLInputElement>
|
|
valueNode: Value | null
|
|
calcResult: string
|
|
prevVariables: PrevVariable<any>[]
|
|
newVariableName: string
|
|
isNewVariableNameUnique: boolean
|
|
newVariableInsertIndex: number
|
|
setNewVariableName: (a: string) => void
|
|
} {
|
|
const { programMemory } = useKclContext()
|
|
const { context } = useModelingContext()
|
|
const selectionRange = context.selectionRanges.codeBasedSelections[0].range
|
|
const inputRef = useRef<HTMLInputElement>(null)
|
|
const [availableVarInfo, setAvailableVarInfo] = useState<
|
|
ReturnType<typeof findAllPreviousVariables>
|
|
>({
|
|
variables: [],
|
|
insertIndex: 0,
|
|
bodyPath: [],
|
|
})
|
|
const [valueNode, setValueNode] = useState<Value | null>(null)
|
|
const [calcResult, setCalcResult] = useState('NAN')
|
|
const [newVariableName, setNewVariableName] = useState('')
|
|
const [isNewVariableNameUnique, setIsNewVariableNameUnique] = useState(true)
|
|
|
|
useEffect(() => {
|
|
setTimeout(() => {
|
|
inputRef.current && inputRef.current.focus()
|
|
inputRef.current &&
|
|
inputRef.current.setSelectionRange(0, String(value).length)
|
|
}, 100)
|
|
setNewVariableName(findUniqueName(kclManager.ast, valueName))
|
|
}, [])
|
|
|
|
useEffect(() => {
|
|
const allVarNames = Object.keys(programMemory.root)
|
|
if (allVarNames.includes(newVariableName)) {
|
|
setIsNewVariableNameUnique(false)
|
|
} else {
|
|
setIsNewVariableNameUnique(true)
|
|
}
|
|
}, [newVariableName])
|
|
|
|
useEffect(() => {
|
|
if (!programMemory || !selectionRange) return
|
|
const varInfo = findAllPreviousVariables(
|
|
kclManager.ast,
|
|
programMemory,
|
|
selectionRange
|
|
)
|
|
setAvailableVarInfo(varInfo)
|
|
}, [kclManager.ast, programMemory, selectionRange])
|
|
|
|
useEffect(() => {
|
|
try {
|
|
const code = `const __result__ = ${value}\nshow(__result__)`
|
|
const ast = parse(code)
|
|
const _programMem: any = { root: {}, return: null }
|
|
availableVarInfo.variables.forEach(({ key, value }) => {
|
|
_programMem.root[key] = { type: 'userVal', value, __meta: [] }
|
|
})
|
|
|
|
executor(
|
|
ast,
|
|
_programMem,
|
|
engineCommandManager,
|
|
kclManager.defaultPlanes
|
|
).then((programMemory) => {
|
|
const resultDeclaration = ast.body.find(
|
|
(a) =>
|
|
a.type === 'VariableDeclaration' &&
|
|
a.declarations?.[0]?.id?.name === '__result__'
|
|
)
|
|
const init =
|
|
resultDeclaration?.type === 'VariableDeclaration' &&
|
|
resultDeclaration?.declarations?.[0]?.init
|
|
const result = programMemory?.root?.__result__?.value
|
|
setCalcResult(typeof result === 'number' ? String(result) : 'NAN')
|
|
init && setValueNode(init)
|
|
})
|
|
} catch (e) {
|
|
setCalcResult('NAN')
|
|
setValueNode(null)
|
|
}
|
|
}, [value])
|
|
|
|
return {
|
|
valueNode,
|
|
calcResult,
|
|
prevVariables: availableVarInfo.variables,
|
|
newVariableInsertIndex: availableVarInfo.insertIndex,
|
|
newVariableName,
|
|
isNewVariableNameUnique,
|
|
setNewVariableName,
|
|
inputRef,
|
|
}
|
|
}
|
|
|
|
export const CalcResult = ({ calcResult }: { calcResult: string }) => {
|
|
return (
|
|
<div className="font-[monospace] pl-4 text-gray-600">
|
|
<span
|
|
className={`${
|
|
calcResult === 'NAN' ? 'bg-pink-200' : ''
|
|
} px-2 py-0.5 rounded`}
|
|
>
|
|
= {calcResult}
|
|
</span>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export const CreateNewVariable = ({
|
|
newVariableName,
|
|
isNewVariableNameUnique,
|
|
setNewVariableName,
|
|
shouldCreateVariable,
|
|
setShouldCreateVariable = () => {},
|
|
showCheckbox = true,
|
|
}: {
|
|
isNewVariableNameUnique: boolean
|
|
newVariableName: string
|
|
setNewVariableName: (a: string) => void
|
|
shouldCreateVariable?: boolean
|
|
setShouldCreateVariable?: (a: boolean) => void
|
|
showCheckbox?: boolean
|
|
}) => {
|
|
return (
|
|
<>
|
|
<label htmlFor="create-new-variable" className="block mt-3 font-mono">
|
|
Create new variable
|
|
</label>
|
|
<div className="mt-1 flex gap-2 items-center">
|
|
{showCheckbox && (
|
|
<input
|
|
type="checkbox"
|
|
checked={shouldCreateVariable}
|
|
onChange={(e) => {
|
|
setShouldCreateVariable(e.target.checked)
|
|
}}
|
|
/>
|
|
)}
|
|
<input
|
|
type="text"
|
|
disabled={!shouldCreateVariable}
|
|
name="create-new-variable"
|
|
id="create-new-variable"
|
|
autoFocus={true}
|
|
autoCapitalize="off"
|
|
autoCorrect="off"
|
|
className={`font-mono flex-1 sm:text-sm px-2 py-1 rounded-sm bg-chalkboard-10 dark:bg-chalkboard-90 text-chalkboard-90 dark:text-chalkboard-10 ${
|
|
!shouldCreateVariable ? 'opacity-50' : ''
|
|
}`}
|
|
value={newVariableName}
|
|
onChange={(e) => {
|
|
setNewVariableName(e.target.value)
|
|
}}
|
|
/>
|
|
</div>
|
|
{!isNewVariableNameUnique && (
|
|
<div className="bg-pink-200 rounded px-2 py-0.5 text-xs">
|
|
Sorry, that's not a unique variable name. Please try something else
|
|
</div>
|
|
)}
|
|
</>
|
|
)
|
|
}
|
|
|
|
export function removeDoubleNegatives(
|
|
valueNode: BinaryPart,
|
|
sign: number,
|
|
variableName?: string
|
|
): BinaryPart {
|
|
let finValue: BinaryPart = variableName
|
|
? createIdentifier(variableName)
|
|
: valueNode
|
|
if (sign === -1) finValue = createUnaryExpression(finValue)
|
|
if (
|
|
finValue.type === 'UnaryExpression' &&
|
|
finValue.operator === '-' &&
|
|
finValue.argument.type === 'UnaryExpression' &&
|
|
finValue.argument.operator === '-'
|
|
) {
|
|
finValue = finValue.argument.argument
|
|
}
|
|
if (
|
|
finValue.type === 'UnaryExpression' &&
|
|
finValue.operator === '-' &&
|
|
finValue.argument.type === 'Literal' &&
|
|
typeof finValue.argument.value === 'number' &&
|
|
finValue.argument.value < 0
|
|
) {
|
|
finValue = createLiteral(-finValue.argument.value)
|
|
}
|
|
return finValue
|
|
}
|