import { Extension } from "evite" import React from "react" import { Window } from "components" import { Skeleton, Tabs } from "antd" class DebuggerUI extends React.Component { state = { loading: true, error: null, debuggers: null, active: null, } toogleLoading = (to = !this.state.loading ?? false) => { this.setState({ loading: to }) } loadDebuggers = async () => { this.toogleLoading(true) const debuggers = await import(`~/debugComponents`) let renders = {} Object.keys(debuggers).forEach((key) => { renders[key] = debuggers[key] }) this.setState({ debuggers: renders }, () => { this.toogleLoading(false) }) } componentDidMount = async () => { await this.loadDebuggers() } componentDidCatch = (error, info) => { this.setState({ error }) } onChangeTab = (key) => { console.debug(`Changing tab to ${key}`) this.setState({ active: key, error: null }) } renderError = (key, error) => { return (

Debugger Error

Catch on [{key}]

`{error.message}`
{error.stack}
) } renderTabs = () => { return Object.keys(this.state.debuggers).map((key) => { return }) } renderDebugger = (_debugger) => { try { return React.createElement(window.app.bindContexts(_debugger)) } catch (error) { return this.renderError(key, error) } } render() { const { loading, error } = this.state if (loading) { return } return (
{this.renderTabs()} {error && this.renderError(this.state.active, error)} {!this.state.active ? (
Select an debugger to start
) : ( this.renderDebugger(this.state.debuggers[this.state.active]) )}
) } } class Debugger { constructor(mainContext, params = {}) { this.mainContext = mainContext this.params = { ...params } this.bindings = {} } openWindow = () => { new Window.DOMWindow({ id: "debugger", children: window.app.bindContexts(DebuggerUI) }).create() } bind = (id, binding) => { this.bindings[id] = binding return binding } unbind = (id) => { delete this.bindings[id] } } export default class VisualDebugger extends Extension { window = { debug: new Debugger(this.mainContext) } }