import React from 'react' import { ResetButtons } from './reset-buttons' import { LogGroup } from 'shared/components/workbench/logs' import { ErrorView as DefaultErrorView } from './view' const ErrorView = (props) => { if (props.children) return props.children const inspectChildrenProps = { type: 'error', logs: [props.error], units: props.gist?.units, } const inspectChildren = <LogGroup {...inspectChildrenProps}></LogGroup> return ( props.children || ( <DefaultErrorView inspectChildren={inspectChildren}> <h4>If you think your last action caused this error, you can: </h4> <ResetButtons undoGist={props.undoGist} resetGist={props.resetGist} /> </DefaultErrorView> ) ) } export class ErrorBoundary extends React.Component { constructor(props) { super(props) this.state = { hasError: false } } static getDerivedStateFromError(error) { // Update state so the next render will show the fallback UI. return { hasError: true, error } } componentDidCatch(error, errorInfo) { // You can also log the error to an error reporting service console.log(error, errorInfo) } componentDidUpdate(prevProps) { if (this.props.gist !== prevProps.gist) { this.setState({ hasError: false }) } } render() { if (this.state.hasError) { // You can render any custom fallback UI return ( <ErrorView {...this.props} error={this.state.error}> {this.errorView} </ErrorView> ) } try { return this.props.children } catch (e) { return ( <ErrorView {...this.props} error={e}> {this.errorView} </ErrorView> ) } } }