import { useRef, useEffect, Suspense, lazy } from 'react' import { Mosaic, MosaicWindow } from 'react-mosaic-component' import { useIdeContext } from 'src/helpers/hooks/useIdeContext' import { requestRender } from 'src/helpers/hooks/useIdeState' import IdeConsole from 'src/components/IdeConsole' import 'react-mosaic-component/react-mosaic-component.css' import EditorMenu from 'src/components/EditorMenu/EditorMenu' import PanelToolbar from 'src/components/PanelToolbar' const IdeEditor = lazy(() => import('src/components/IdeEditor/IdeEditor')) const IdeViewer = lazy(() => import('src/components/IdeViewer/IdeViewer')) const SmallLoadingPing = (
. . . loading
) const BigLoadingPing = () => (
) const ELEMENT_MAP = { Editor: ( ), Viewer: ( ), Console: , } const TOOLBAR_MAP = { Editor: (
), Viewer: (
), Console: (
), } const IdeContainer = () => { const { state, thunkDispatch } = useIdeContext() const viewerDOM = useRef(null) const debounceTimeoutId = useRef useEffect(handleViewerSizeUpdate, [viewerDOM]) function handleViewerSizeUpdate() { if (viewerDOM !== null && viewerDOM.current) { const { width, height } = viewerDOM.current.getBoundingClientRect() thunkDispatch({ type: 'updateViewerSize', payload: { viewerSize: { width, height } }, }) thunkDispatch((dispatch, getState) => { const state = getState() if (['png', 'INIT'].includes(state.objectData?.type)) { dispatch({ type: 'setLoading' }) requestRender({ state, dispatch, code: state.code, viewerSize: { width, height }, camera: state.camera, }) } }) } } const debouncedViewerSizeUpdate = () => { clearTimeout(debounceTimeoutId.current) debounceTimeoutId.current = setTimeout(() => { handleViewerSizeUpdate() }, 1000) } useEffect(() => { window.addEventListener('resize', debouncedViewerSizeUpdate) return () => { window.removeEventListener('resize', debouncedViewerSizeUpdate) } }, []) return (
{ return ( TOOLBAR_MAP[id]} className={`${id.toLowerCase()} ${id.toLowerCase()}-tile`} > {id === 'Viewer' ? (
{ELEMENT_MAP[id]}
) : ( ELEMENT_MAP[id] )}
) }} value={state.layout} onChange={(newLayout) => thunkDispatch({ type: 'setLayout', payload: { message: newLayout } }) } onRelease={handleViewerSizeUpdate} />
) } export default IdeContainer