import { useEffect, useRef, useState } from 'react' import { useIdeContext } from 'src/helpers/hooks/useIdeContext' import { makeCodeStoreKey, requestRender } from 'src/helpers/hooks/useIdeState' import Editor, { useMonaco } from '@monaco-editor/react' import { theme } from 'src/../config/tailwind.config' import { useSaveCode } from 'src/components/IdeWrapper/useSaveCode' import type { CadPackageType } from 'src/components/CadPackage/CadPackage' import EditorGuide from 'src/components/EditorGuide/EditorGuide' const colors = theme.extend.colors const IdeEditor = ({ Loading }) => { const { state, thunkDispatch } = useIdeContext() const [theme, setTheme] = useState('vs-dark') const saveCode = useSaveCode() const ideTypeToLanguageMap: { [key in CadPackageType]: string } = { cadquery: 'python', openscad: 'cpp', jscad: 'javascript', curv: 'javascript', INIT: '', } const monaco = useMonaco() useEffect(() => { if (monaco) { const themeName = 'cadhub' monaco.editor.defineTheme(themeName, { base: 'vs-dark', inherit: true, rules: [ { background: colors['ch-gray'][750] }, { token: 'comment', foreground: colors['ch-blue'][600], fontStyle: 'italic', }, { token: 'keyword', foreground: colors['ch-purple'][600] }, { token: 'string', foreground: colors['ch-pink'][300] }, ], colors: { 'editor.background': colors['ch-gray'][800], }, }) setTheme(themeName) } }, [monaco]) function handleCodeChange(value, _event) { thunkDispatch({ type: 'updateCode', payload: value }) } function handleSaveHotkey(event) { //ctrl|meta + s is very intuitive for most devs const { key, ctrlKey, metaKey } = event if (key === 's' && (ctrlKey || metaKey)) { event.preventDefault() thunkDispatch((dispatch, getState) => { const state = getState() dispatch({ type: 'setLoading' }) saveCode({ code: state.code }) requestRender({ state, dispatch, }) }) localStorage.setItem(makeCodeStoreKey(state.ideType), state.code) } } const currentTab = state.editorTabs[state.currentModel] return (
{state.editorTabs.length > 1 && (
{state.editorTabs.map((model, i) => ( ))}
)} {currentTab.type === 'code' && ( )} {currentTab.type === 'guide' && (
)} {currentTab.type === 'component' && }
) } export default IdeEditor