import ReactJson from 'react-json-view' import { useMemo } from 'react' import { ProgramMemory, Path, ExtrudeSurface } from 'lang/wasm' import { useKclContext } from 'lang/KclProvider' import { useResolvedTheme } from 'hooks/useResolvedTheme' import { ActionButton } from 'components/ActionButton' import toast from 'react-hot-toast' import Tooltip from 'components/Tooltip' import { useModelingContext } from 'hooks/useModelingContext' export const MemoryPaneMenu = () => { const { programMemory } = useKclContext() function copyProgramMemoryToClipboard() { if (globalThis && 'navigator' in globalThis) { try { navigator.clipboard.writeText(JSON.stringify(programMemory)) toast.success('Program memory copied to clipboard') } catch (e) { toast.error('Failed to copy program memory to clipboard') } } } return ( <> Copy to clipboard ) } export const MemoryPane = () => { const theme = useResolvedTheme() const { programMemory } = useKclContext() const { state } = useModelingContext() const ProcessedMemory = useMemo( () => processMemory(programMemory), [programMemory] ) return (
{state.matches('Sketch') && (
)}
) } export const processMemory = (programMemory: ProgramMemory) => { const processedMemory: any = {} Object.keys(programMemory?.root || {}).forEach((key) => { const val = programMemory.root[key] if (typeof val.value !== 'function') { if (val.type === 'SketchGroup') { processedMemory[key] = val.value.map(({ __geoMeta, ...rest }: Path) => { return rest }) } else if (val.type === 'ExtrudeGroup') { processedMemory[key] = val.value.map(({ ...rest }: ExtrudeSurface) => { return rest }) } else if ((val.type as any) === 'Function') { processedMemory[key] = `__function(${(val as any)?.expression?.params ?.map?.(({ identifier }: any) => identifier?.name || '') .join(', ')})__` } else { processedMemory[key] = val.value } } else if (key !== 'log') { processedMemory[key] = '__function__' } }) return processedMemory }