import { useRef, useState, useEffect, useMemo } from 'react' import { Canvas } from '@react-three/fiber' import { Allotment } from 'allotment' import { OrbitControls, OrthographicCamera } from '@react-three/drei' import { lexer } from './lang/tokeniser' import { abstractSyntaxTree } from './lang/abstractSyntaxTree' import { executor, ExtrudeGroup, SketchGroup } from './lang/executor' import { recast } from './lang/recast' import CodeMirror from '@uiw/react-codemirror' import { javascript } from '@codemirror/lang-javascript' import { ViewUpdate } from '@codemirror/view' import { lineHighlightField, addLineHighlight, } from './editor/highlightextension' import { useStore } from './useStore' import { Toolbar } from './Toolbar' import { BasePlanes } from './components/BasePlanes' import { SketchPlane } from './components/SketchPlane' import { Logs } from './components/Logs' import { AxisIndicator } from './components/AxisIndicator' import { RenderViewerArtifacts } from './components/RenderViewerArtifacts' import { PanelHeader } from './components/PanelHeader' import { MemoryPanel } from './components/MemoryPanel' const OrrthographicCamera = OrthographicCamera as any function App() { const cam = useRef() const { editorView, setEditorView, setSelectionRange, selectionRange, guiMode, lastGuiMode, removeError, addLog, code, setCode, setAst, // formatCode, ast, setError, errorState, setProgramMemory, resetLogs, } = useStore((s) => ({ editorView: s.editorView, setEditorView: s.setEditorView, setSelectionRange: s.setSelectionRange, selectionRange: s.selectionRange, guiMode: s.guiMode, setGuiMode: s.setGuiMode, removeError: s.removeError, addLog: s.addLog, code: s.code, setCode: s.setCode, ast: s.ast, setAst: s.setAst, lastGuiMode: s.lastGuiMode, // formatCode: s.formatCode, setError: s.setError, errorState: s.errorState, setProgramMemory: s.setProgramMemory, resetLogs: s.resetLogs, })) // const onChange = React.useCallback((value: string, viewUpdate: ViewUpdate) => { const onChange = (value: string, viewUpdate: ViewUpdate) => { setCode(value) if (editorView) { editorView?.dispatch({ effects: addLineHighlight.of([0, 0]) }) } } //, []); const onUpdate = (viewUpdate: ViewUpdate) => { if (!editorView) { setEditorView(viewUpdate.view) } const range = viewUpdate.state.selection.ranges[0] // console.log(viewUpdate.state.selection.ranges) // TODO allow multiple cursors so that we can do constrain style features const isNoChange = range.from === selectionRange[0] && range.to === selectionRange[1] if (isNoChange) return setSelectionRange([range.from, range.to]) } const [geoArray, setGeoArray] = useState<(ExtrudeGroup | SketchGroup)[]>([]) useEffect(() => { try { if (!code) { setGeoArray([]) setAst(null) removeError() return } const tokens = lexer(code) const _ast = abstractSyntaxTree(tokens) setAst(_ast) resetLogs() const programMemory = executor(_ast, { root: { log: { type: 'userVal', value: (a: any) => { addLog(a) }, __meta: [ { pathToNode: [], sourceRange: [0, 0], }, ], }, }, _sketch: [], }) setProgramMemory(programMemory) const geos = programMemory?.return ?.map(({ name }: { name: string }) => { const artifact = programMemory?.root?.[name] if ( artifact.type === 'extrudeGroup' || artifact.type === 'sketchGroup' ) { return artifact } return null }) .filter((a) => a) as (ExtrudeGroup | SketchGroup)[] setGeoArray(geos) removeError() console.log(programMemory) setError() } catch (e: any) { setError('problem') console.log(e) addLog(e) } }, [code]) const shouldFormat = useMemo(() => { if (!ast) return false const recastedCode = recast(ast) return recastedCode !== code }, [code, ast]) return (
{/* */}
setEditorView(_editorView)} />
{errorState.isError && (
                  {'last first: \n\n' +
                    JSON.stringify(lastGuiMode, null, 2) +
                    '\n\n' +
                    JSON.stringify(guiMode)}
                
)}
) } export default App